【问题标题】:Special Characters in Batch File批处理文件中的特殊字符
【发布时间】:2016-05-19 20:40:20
【问题描述】:

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

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%"

它仍然无法正常工作,我不确定我现在缺少什么。

【问题讨论】:

标签: windows batch-file cmd escaping


【解决方案1】:

假设你想要字符串^&AntiBatchfileString,这是最好的set语法,因为大多数特殊字符(^&()<>|和标准分隔符, ; = SPACE TAB) 一旦放在"""" 之间就失去了它们的特殊含义自己不会成为变量值的一部分:

set "pass=^&AntiBatchfileString"

这仅在打开命令扩展时有效,无论如何这都是 Windows 的默认设置(键入 cmd /? 并查看 /E 选项)。

当扩展(读取)像"%pass%"(包含"")这样的变量时,特殊字符仍按字面意思处理。

但是,一旦你像%pass%(不是"")一样扩展它,它们就会恢复它们的特殊含义。所以你有以下选择:

  1. 使用set "pass=^^^&AntiBatchfileString",其中^^ 转义文字^^& 转义文字&,当像%pass% 一样阅读时。
  2. 启用延迟扩展(请参阅set /? 了解它的工作原理和setlocal /?cmd /? 了解如何启用它),其中变量值在解析特殊字符的时间点进行扩展(读取)已经完成了。

我更喜欢后一种方式,因为不需要特殊的转义,而且它还可以处理字符串值中出现的"(即使不对称存在)。
顺便说一句," 也可以被^" 转义,只要它没有出现在未转义的"" 中。

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

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

【讨论】:

  • 啊,我现在明白了,而且在摆弄了这么多之后,我没有意识到我在尝试其他东西时将这部分留在了"/pass=%pass%"。它现在正在工作,感谢@aschipfl 的提示!
【解决方案2】:

如果您想将 % 用作字符串而不在批处理文件中转义:

和%20一样,你可以使用%%%20

git clone "https:// abc.com /D%%%220an"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-25
    相关资源
    最近更新 更多