环境变量中包含带有空格的可执行路径时,是否应该包含必要的引号?

6
在定义环境变量时(对我来说是在Windows上,也许有更普遍的指南),请注意以下几点:
set MY_TOOL=C:\DevTools\bin\mytool.exe

如果该工具位于带有空格的路径上

set MY_TOOL=C:\Program Files (x86)\Foobar\bin\mytool.exe

环境变量中是否已包含必要的空格?

也就是说,它应该这样写:

set MY_TOOL="C:\Program Files (x86)\Foobar\bin\mytool.exe"

与上面没有空格的版本不同的是?

注意:鉴于乔伊的回答,我真的应该将这个问题缩小到我给出的例子。也就是说,包含一个单一的(可执行的/批处理)工具的环境变量,可以由用户或另一个批处理脚本调用。

也许空格应该以不同的方式转义?


这似乎与此问题有关 https://dev59.com/WHI-5IYBdhLWcg3wcn7m - Alftheo
2个回答

5
我建议您不要使用引号,并在使用变量的任何地方都不要使用引号:
set MY_TOOL=C:\Program Files (x86)\Foobar\bin\mytool.exe

"%MY_TOOL%" -someoption someargument somefile

特别是如果您让用户在某个地方设置值,我认为这是最安全的选择,因为他们通常不会用引号将其括起来。

如果您有很多地方使用变量,当然可以重新定义:

set MY_TOOL="%MY_TOOL%"

这将使您的事情更具弹性。如果未添加引号,您可以选择检测是否存在引号,并在没有引号的情况下添加引号以确保完全正确。

当您的变量仅表示目录路径并且要在其中添加文件名时,“不带引号”的问题尤为重要,否则您将构建类似以下路径:

"C:\Program Files (x86)\Foobar\bin"\mytool.exe

甚至可以:
""C:\Program Files (x86)\Foobar\bin"\my tool with spaces.exe"

我怀疑这段代码可能无法正确解析。

2
实际上,Windows 只是在路径中使用引号来保护空格和特殊字符,但在其他方面则忽略它们。因此,像 "C:\Program Files (x86)\Foobar\bin"\"my tool.exe" 这样的东西对于执行、PATH、DIR、COPY 等操作都可以正常解析。它等同于 "C:\Program Files (x86)\Foobar\bin\my tool.exe" - dbenham

-1
命令行可以回答您的问题:键入C:\Pro并按下Tab键。自动完成将保留所有空格,同时在文件名周围添加引号。因此,这就是“官方”预期的结果。(假设启用了自动完成,我不确定默认是否启用,但大多数人都会启用它,我想)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接