我需要调用一个接受密码作为其参数之一的脚本。每当密码包含,
时,它将被视为定界符,并且密码将被分为两个参数,并且当密码包含!
时,将忽略所有特殊字符。我尝试将它们包含在'
,"
中,并对密码进行预处理以同时使用^
和^^
进行转义。不幸的是,没有任何效果。如何在密码中保留这些特殊字符?
您是正确的,必须暂时禁用延迟扩展才能正常工作。 !
必须转义,引用会处理其余部分:
@echo off
setlocal enabledelayedexpansion
REM --- get parameter ---
setlocal disabledelayedexpansion
set "x=%~1"
endlocal & set "x=%x:!=^!%"
REM --- end get param ---
set x
echo "!x!"
输出:
C:\TEST>test.bat "pass,!<& %|>word"
x=pass,!<& %|>word
"pass,!<& %|>word"
主要技巧是endlocal & set "x=%x:!=^!%"
行。 set
命令仍然是[[parsed,没有延迟扩展,但在endlocal
之后是exected(因为整行在执行任何命令之前已被分析-是的,很奇怪的事情...)]