启用延迟扩展时将带有特殊字符的参数传递给批处理脚本
Passing arguments with special characters to batch script while delayedexpansion enabled
我需要调用一个接受密码作为其参数之一的脚本。当密码包含 ,
时,它被视为分隔符,密码将被分成两个参数,当它包含 !
时,所有特殊字符都将被省略。我已经尝试将它们包含在 '
、"
中并预处理密码以使用 ^
和 ^^
进行转义。不幸的是,没有任何效果。如何保留密码中的这些特殊字符?
你是对的,必须(暂时)关闭延迟扩展才能正常工作。 !
必须被转义(对于稍后的延迟部分)并且引用会处理其余部分:
@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 没有延迟扩展,但是 executed 在 endlocal
之后(因为整行在解析之前任何东西都会被执行 - 是的,奇怪的事情......)
我需要调用一个接受密码作为其参数之一的脚本。当密码包含 ,
时,它被视为分隔符,密码将被分成两个参数,当它包含 !
时,所有特殊字符都将被省略。我已经尝试将它们包含在 '
、"
中并预处理密码以使用 ^
和 ^^
进行转义。不幸的是,没有任何效果。如何保留密码中的这些特殊字符?
你是对的,必须(暂时)关闭延迟扩展才能正常工作。 !
必须被转义(对于稍后的延迟部分)并且引用会处理其余部分:
@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 没有延迟扩展,但是 executed 在 endlocal
之后(因为整行在解析之前任何东西都会被执行 - 是的,奇怪的事情......)