批处理文件中的特殊字符

时间:2016-05-19 20:40:21

标签: windows batch-file escaping

批处理文件中的特殊字符很难,但我还没有找到正确的解决方法来正确转义此特定字符串的前两个字符我试图通过该应用程序。

SET pass=^&AntiBatchfileString
A_Program.exe /pass=%pass%

我尝试过的事情:

:: Escaping the escape twice, first for ^, second for &.
SET pass=^^^^&AntiBatchfileString
echo %pass%

:: Combining escapes.
SET first=^^
SET second=^^&AntiBatchfileString
SET pass=%first%%second%
echo %pass%

:: Preventing expansion
SET first=^^
SET second=^^&AntiBatchfileString
SET pass=!first!%second%
echo %pass%

:: I got this to print correctly
SET "pass=^&AntiBatchfileString"
echo ^^%pass%

当通过最后一个时它仍然不接受登录,我不知道最终输出是什么。这让我想到也许是在将参数传递给应用程序时尝试进行另一次扩展,所以我也引用了它。

SET "pass=^&AntiBatchfileString"
A_Program.exe "/pass=^^%pass%"

它仍然无法正常工作,我不确定此时我所缺少的是什么。

1 个答案:

答案 0 :(得分:10)

假设你想要字符串^&AntiBatchfileString,这是最好的set语法,因为大多数特殊字符(^ & ( {{1} } ) < >以及标准分隔符| , ; SPACE TAB )在=之间放置其特定含义,""本身不会成为变量值的一部分:

""

只有在命令扩展开启时才会起作用,无论如何都是Windows默认值(键入set "pass=^&AntiBatchfileString" 并查看cmd /?选项)。

扩展(读取)/E之类的变量(包含"%pass%")时,仍会按字面处理特殊字符。

然而,只要你像""(没有%pass%)那样展开它们,它们就会恢复它们的特殊含义。所以你有以下选择:

  1. 使用"",其中set "pass=^^^&AntiBatchfileString"在阅读^^时,文字^^&文字&。{/ li>
  2. 启用延迟展开(请参阅%pass%有关其工作原理以及set /?setlocal /?如何启用它),其中变量值在某个时间点展开(读取)解析特殊字符的地方已经完成。
  3. 我更喜欢后一种方法,因为不需要特殊的转义,它也可以处理出现在字符串值中的cmd /?(即使不对称存在)。
    顺便说一下,"也可以"进行转义,只要这不会出现在未转义的^"内。

    尽管如此,""符号无法像批处理文件中的%那样进行转义,因为转义百分比会在转义之前发生,但您需要将它们加倍,例如^%以获得一个字面值,无论字符串是否在%%之间 请注意,在控制台上,""不起作用。

    最后,文字%%在启用时会被延迟扩展功能使用,因此您需要特别注意这些内容,通过像!那样转义,或者通过智能切换延迟扩展(因此只有在实际需要时启用它,否则禁用它,否则,当提供文字字符串时,例如在^!命令行中,例如,在扩展标准变量如set时在阅读%pass%变量时,例如for(批处理文件)或%%I(控制台)。当然,这也不是最终解决方案,因为您需要%Isetlocal来启用/禁用延迟扩展,这些扩展旨在本地化环境更改,因此自最近{{1}以来任何变量都会发生变化一旦执行endlocal,命令就会丢失(虽然有一些技巧可以通过setlocal障碍传递变量值。)