批处理脚本(bat或cmd) - &符之前的额外空格(或自动转换&符号)

时间:2014-09-14 03:51:21

标签: windows powershell batch-file cmd escaping

注意:我了解^符号可用于在批处理脚本中转义&符号。但我需要转义自动,因为路径是在运行时构建的。下面的示例脚本仅用于显示问题,而不是实际脚本。 请在脚本输出后阅读我的解释。

由于某些原因,批处理脚本中的命令与路径中的&符号(&)符号表现不佳。

假设您有test.cmdtest.bat脚本,如下所示:

set TEST=A E
echo %TEST%

set TEST="A E"
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=A E
C:\>echo A E
A E

C:\>set TEST="A E"
C:\>echo "A E"
"A E"

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"

注意当字符串不是双引号时,脚本解析器如何在&符号(&)之前添加两个额外的空格。在添加两个空格之前,它还会将A&E分解为A& E,从而产生A & E

在现实生活中,这会在将包含文件夹名称中的&符号(&)符号的路径附加到PATH变量时导致问题。 <{1}}引用为PATH时,即使是一组现有的文件夹路径也会出现此问题。

它出现在命令提示符 PowerShell 中。我试过set PATH=C:\Another\Folder;%PATH%,但没有帮助。

为什么它会这样?它看起来是因为在批处理脚本中使用enableDelayedExpansion来连接两个命令?如果是,我如何确保自动转发 (因为&值会在运行时自动构建,因此我无法使用PATH转义 - 批处理脚本中的路径硬编码。)

目前我找到的唯一解决方法(如上所示)是将整个字符串括在双引号(^)中。对于"变量的现有值,我想我需要在循环中解析该值并在其中的每个文件夹路径中添加引号。还有其他(可能更容易)的解决方法或永久解决方案吗?

1 个答案:

答案 0 :(得分:4)

启用延迟扩展并尝试此操作:

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

对于PATH等环境变量,其现有值包含&

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