包含带空格的可执行路径的环境变量是否也包含必要的引号?

Mar*_* Ba 5 windows command-line spaces batch-file environment-variables

在定义环境变量时(在Windows上对我来说,可能有更一般的指导原则)

set MY_TOOL=C:\DevTools\bin\mytool.exe
Run Code Online (Sandbox Code Playgroud)

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

set MY_TOOL=C:\Program Files (x86)\Foobar\bin\mytool.exe
Run Code Online (Sandbox Code Playgroud)

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

那就是它应该是:

set MY_TOOL="C:\Program Files (x86)\Foobar\bin\mytool.exe"
Run Code Online (Sandbox Code Playgroud)

而不是没有空格的上述版本?

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

也许这些空间应该以不同方式逃脱?

Joe*_*oey 5

我会说,在没有引号的情况下执行它并在使用变量的任何地方使用它们:

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

"%MY_TOOL%" -someoption someargument somefile
Run Code Online (Sandbox Code Playgroud)

特别是如果你让用户在某处设置值,我猜这是最安全的选项,因为它们通常不会用引号括起来而不是这样做.

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

set MY_TOOL="%MY_TOOL%"
Run Code Online (Sandbox Code Playgroud)

这让你的生活变得更有弹性.您可以选择检测是否有引号,如果不存在则添加它们以完全确定.

当你的变量只代表一个目录的路径并且你想在那里附加文件名时,那么"无引号"的东西就更重要了,否则你就会构建像

"C:\Program Files (x86)\Foobar\bin"\mytool.exe
Run Code Online (Sandbox Code Playgroud)

甚至:

""C:\Program Files (x86)\Foobar\bin"\my tool with spaces.exe"
Run Code Online (Sandbox Code Playgroud)

我怀疑会正确解析.

  • 实际上,Windows仅使用路径周围和/或路径内的引号来防止空格和特殊字符,但在所有其他方面忽略它们.所以像"C:\ Program Files(x86)\ Foobar\bin"\"my tool.exe"`这样的东西会解析为执行,PATH,DIR,COPY等等.它相当于``C:\Program Files(x86)\ Foobar\bin\my tool.exe"` (2认同)