Windows Batch-保护变量中的特殊字符

命令需要使用如下所示的序列: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,执行之前显示的完全相同 strong>作为处于交互模式的一种,可以使用。实际上,命令行抱怨该序列应仅包含33-256范围内的ASCII字符,并且长度恰好为12个字符。引号也成为价值的一部分。

尝试保护每个字符失败,无论是否带引号:

  • 使用set SEQUENCE=Z^;[^^%%^&.:mn^=WO,该行将为:

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

    它产生错误“系统找不到驱动器”(.:之类的声音被解释为驱动器切换)

  • 使用set SEQUENCE="Z^;[^^%%^&.:mn^=WO",该行将为:

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

    它抱怨序列大小以及第一次尝试

尝试了其他字符转义尝试,但均未成功,例如用引号引起来的字符串(""中的引号转义)。这里错过了什么?在用Bash重写之前询问。


更新:我今天早上注意到,复制的尝试显示双尖号(^^)。我不记得为什么这么做了。我让它就位。

wvw1986 回答:Windows Batch-保护变量中的特殊字符

renderer returned unicode,and did not specify a charset value 中,batch-file将消耗第一个cmd,因此只需加倍:

%

,或者如果您想保留双引号作为值的一部分,则不建议这样做:

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

如果需要在不带双引号的情况下直接使用它,则需要直接在set SEQUENCE="Z;[%%&.:mn=WO" some_command -s %SEQUENCE% 上加倍并转义%,否则与号将被视为链接运算符:

&

可以在Robvanderwoude上找到表格形式的所有转义序列的好资源

编辑

要显式some_command -s Z;[%%^&.:mn=WO ,只需再次对变量call进行两次操作即可:

%
,

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

假设未在代码块中设置%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

忽略胡萝卜的原始内容,我是在唤醒AM时写的,显然我的大脑仍在思考前一天我运行的一些命令并感到困惑,因为在CMD CLI中,您需要使用{ {1}}逃脱^,以强制延迟某些变量的扩展。

本文链接:https://www.f2er.com/3110408.html

大家都在问