Windows 批处理 - 保护变量中的特殊字符

Windows Batch - Protect special characters in a variable

命令需要使用如下所示的序列:Z;[%&.:mn=WO以下调用有效

D:\Some_folder> some_command -s "Z;[%&.:mn=WO"

目的是将此调用嵌入批处理文件中,其行为与交互模式不同。

如您所见,有几个特殊字符,因此必须在使用前对其进行保护。批处理文件类似于下面的示例:

set SEQUENCE=<sequence>
call %SOMEREP%\command -s %SEQUENCE% REM blah blah blah

使用set SEQUENCE="Z;[%&.:mn=WO"会失败,令人惊讶的是,使用echo on,执行前显示的交互模式完全相同,后者有效。实际上,命令行抱怨该序列应该只包含 33-256 范围内的 ASCII 字符,并且恰好是 12 个字符长度。因为引号成为了价值的一部分。

保护每个字符的尝试失败,有或没有引号:

尝试了其他字符转义尝试但没有成功,例如在引号字符串中转义引号 ("")。这里遗漏了什么要点?在 Bash.

重写之前询问

更新:我今天早上注意到重现的尝试显示了双插入符号 (^^)。我不记得为什么这样做了。我让它到位。

调用命令通常是不必要的,除非你在循环中设置了变量并且没有启用延迟扩展(我曾经明确避免延迟扩展并使用调用,然后我需要它。)

假设 %SOMEREP% 没有在代码块中设置(因此不需要 Call 它)那么下面应该做。

基本上只需将变量的 % 加倍一次,除非您确实需要调用,在这种情况下您需要将其加倍。

没有来电:

Set "_CMD=%SOMEREP%\command"
Set "_SEQUENCE=Z;[%%&.:mn=WO"
"%_CMD%" -s "%_SEQUENCE%"
REM blah blah

假设您确实需要 call 命令,下面使用 %%%%

两次转义 %
Set "_CMD=%SOMEREP%\command"
Set "_SEQUENCE=Z;[%%%%&.:mn=WO"
call "%_CMD%" -s "%_SEQUENCE%"
REM blah blah

忽略关于胡萝卜的原始部分,我在这个上午醒来时写了这篇文章,显然我的大脑仍在思考我前一天运行的一些命令并且感到困惑,因为在 CMD CLI 中你需要使用 ^ 转义 % 以强制延迟扩展某些变量。

batch-file 内,cmd 将消耗第一个 %,所以加倍使用它:

set "SEQUENCE=Z;[%%&.:mn=WO"
some_command -s "%SEQUENCE%"

或者如果你想保留双引号作为值的一部分,虽然这不是首选:

set SEQUENCE="Z;[%%&.:mn=WO"
some_command -s %SEQUENCE%

如果需要在没有双引号的情况下直接从命令中使用它,您需要在 % 上加倍并转义 & 否则符号将被视为链接运算符:

some_command -s Z;[%%^&.:mn=WO

一个很好的来源,采用 table 形式,所有转义序列都可以在 Robvanderwoude

上找到

编辑

要显式 call 它,只需再次对变量 % 加倍即可:

set SEQUENCE="Z;[%%&.:mn=WO"
call some_command -s "%%SEQUENCE%%"