批处理脚本(bat或cmd) – &符号之前的空格(或自动转义符号)

注意:我知道^符号可以用来在批处理脚本中转义符号。 但是我需要自动完成转义,因为path是在运行时构build的。 下面的示例脚本仅仅是显示问题,而不是实际的脚本。 脚本输出后请阅读我的解释。

由于某些原因,批处理脚本中的命令对于path中的与号( & )符号performance不佳。

假设你有一个test.cmdtest.bat脚本,如下所示:

 set TEST=AE echo %TEST% set TEST="AE" echo %TEST% set TEST=AE echo %TEST% set TEST="AE" echo %TEST% set TEST=A & E echo %TEST% set TEST="A & E" echo %TEST% set TEST=A&E echo %TEST% set TEST="A&E" echo %TEST% 

这是输出:

 C:\>set TEST=AE C:\>echo AE AE C:\>set TEST="AE" C:\>echo "AE" "AE" C:\>set TEST=AE C:\>echo AE AE C:\>set TEST="AE" C:\>echo "AE" "AE" C:\>set TEST=A & E 'E' is not recognized as an internal or external command, operable program or batch file. C:\>echo A A C:\>set TEST="A & E" C:\>echo "A & E" "A & E" C:\>set TEST=A & E 'E' is not recognized as an internal or external command, operable program or batch file. C:\>echo A A C:\>set TEST="A&E" C:\>echo "A&E" "A&E" 

请注意,如果string不是双引号,脚本parsing器如何在符号( & )符号之前添加两个额外的空格。 在添加两个空格之前,它也将A&E分解成A& E ,导致A & E

在真实情况下,在将包含&符号的path附加到PATHvariables的文件夹名称中时会导致问题。 即使PATH一组现有的文件夹path被引用为set PATH=C:\Another\Folder;%PATH%也会遇到此问题。

它出现在命令提示符PowerShell中 。 我试过enableDelayedExpansion但它没有帮助。

为什么这样做? 它看起来像是因为在批处理脚本中使用了两个命令? 如果是,我如何确保它自动转义(因为PATH值是在运行时自动构造的,所以我不能用^转义 – path在批处理脚本中没有硬编码)。

目前唯一的解决方法,我发现(如上所示)是将整个string用双引号( " )。对于PATHvariables的现有值,我想我将需要parsing在循环中的值,并将引号添加到每文件夹path在里面有没有其他的(也许更容易)解决方法或永久性的解决scheme?

启用延迟扩展,并试试这个:

 Set "test1=c:\file&folder\" Set "test2=!test1!currentPath" echo !test2! 

对于包含&的现有值的环境变量,如PATH

 set PATH=C:\Another\Folder;!PATH!