在启用delayedexpansion时向批处理脚本传递具有特殊字符的参数



我需要调用一个接受密码作为参数之一的脚本。当密码包含,时,它被视为分隔符,密码将被拆分为两个参数,当它包含!时,所有特殊字符都被省略。我尝试将它们封装在'"中,并预处理密码以使用^^^进行转义。不幸的是,什么都没用。如何在密码中保留这些特殊字符?

你是对的,必须(暂时(关闭延迟扩展才能正常工作。!必须转义(稍后针对延迟的部分(,其余部分由引用处理:

@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之后执行(因为整行都在执行之前被解析-是的,奇怪的事情…(

最新更新