我需要调用一个接受密码作为参数之一的脚本。当密码包含,
时,它被视为分隔符,密码将被拆分为两个参数,当它包含!
时,所有特殊字符都被省略。我尝试将它们封装在'
、"
中,并预处理密码以使用^
和^^
进行转义。不幸的是,什么都没用。如何在密码中保留这些特殊字符?
你是对的,必须(暂时(关闭延迟扩展才能正常工作。!
必须转义(稍后针对延迟的部分(,其余部分由引用处理:
@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
命令仍然被解析,没有延迟扩展,但在endlocal
之后执行(因为整行都在执行之前被解析-是的,奇怪的事情…(