启用延迟扩展时将带有特殊字符的参数传递给批处理脚本

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 没有延迟扩展,但是 executedendlocal 之后(因为整行在解析之前任何东西都会被执行 - 是的,奇怪的事情......)