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 个字符长度。因为引号成为了价值的一部分。
保护每个字符的尝试失败,有或没有引号:
使用 set SEQUENCE=Z^;[^^%%^&.:mn^=WO
,该行将是:
D:\Some_folder> some_command -s Z;[% & .:mn=WO
它产生错误"The system cannot find the drive"(听起来像.:
被解释为驱动器切换)
使用 set SEQUENCE="Z^;[^^%%^&.:mn^=WO"
,该行将是:
D:\Some_folder> some_command -s "Z^;[^^%^&.:mn^=WO"
它抱怨序列大小,以及第一次尝试
尝试了其他字符转义尝试但没有成功,例如在引号字符串中转义引号 (""
)。这里遗漏了什么要点?在 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%%"
命令需要使用如下所示的序列: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 个字符长度。因为引号成为了价值的一部分。
保护每个字符的尝试失败,有或没有引号:
使用
set SEQUENCE=Z^;[^^%%^&.:mn^=WO
,该行将是:D:\Some_folder> some_command -s Z;[% & .:mn=WO
它产生错误"The system cannot find the drive"(听起来像
.:
被解释为驱动器切换)使用
set SEQUENCE="Z^;[^^%%^&.:mn^=WO"
,该行将是:D:\Some_folder> some_command -s "Z^;[^^%^&.:mn^=WO"
它抱怨序列大小,以及第一次尝试
尝试了其他字符转义尝试但没有成功,例如在引号字符串中转义引号 (""
)。这里遗漏了什么要点?在 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%%"