注意:我知道^
符号可以用来在批处理脚本中转义符号。 但是我需要自动完成转义,因为path是在运行时构build的。 下面的示例脚本仅仅是显示问题,而不是实际的脚本。 脚本输出后请阅读我的解释。
由于某些原因,批处理脚本中的命令对于path中的与号( &
)符号performance不佳。
假设你有一个test.cmd
或test.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附加到PATH
variables的文件夹名称中时,会导致问题。 即使PATH
一组现有的文件夹path被引用为set PATH=C:\Another\Folder;%PATH%
也会遇到此问题。
它出现在命令提示符和PowerShell中 。 我试过enableDelayedExpansion
但它没有帮助。
为什么这样做? 它看起来像是因为在批处理脚本中使用了两个命令? 如果是,我如何确保它自动转义(因为PATH
值是在运行时自动构造的,所以我不能用^
转义 – path在批处理脚本中没有硬编码)。
目前唯一的解决方法,我发现(如上所示)是将整个string用双引号( "
)。对于PATH
variables的现有值,我想我将需要parsing在循环中的值,并将引号添加到每文件夹path在里面有没有其他的(也许更容易)解决方法或永久性的解决scheme?
启用延迟扩展,并试试这个:
Set "test1=c:\file&folder\" Set "test2=!test1!currentPath" echo !test2!
对于包含&
的现有值的环境变量,如PATH
:
set PATH=C:\Another\Folder;!PATH!