Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 包含带空格的可执行路径的环境变量是否也应包含必要的引号?_Windows_Command Line_Batch File_Environment Variables_Spaces - Fatal编程技术网

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

Windows 包含带空格的可执行路径的环境变量是否也应包含必要的引号?,windows,command-line,batch-file,environment-variables,spaces,Windows,Command Line,Batch File,Environment Variables,Spaces,定义环境变量时(在Windows for me上,可能有更一般的指导原则) 如果工具位于带有空格的路径上 set MY_TOOL=C:\Program Files (x86)\Foobar\bin\mytool.exe 环境变量是否已经包含必要的空格 也就是说,应改为: set MY_TOOL="C:\Program Files (x86)\Foobar\bin\mytool.exe" 而不是上面没有空格的版本 注:鉴于,我真的应该把这个问题缩小到我给出的例子。也就是说,包含单个(可执行/批

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

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

set MY_TOOL=C:\Program Files (x86)\Foobar\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

"%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"

我怀疑它是否能正确解析。

命令shell可以回答您的问题:键入
C:\Pro
,然后按tab键

“自动完成”将保留所有空格,并在文件名周围添加引号。所以,这就是“官方”所期望的


(这假设打开了自动完成,我不确定默认设置是打开还是关闭,但我想大多数人都打开了它)

这似乎与这个问题有关,实际上Windows只在路径周围和/或路径内使用引号来防止空格和特殊字符,但在所有其他方面都忽略了它们。因此,类似于
“C:\Program Files(x86)\Foobar\bin”\“my tool.exe”
之类的东西可以很好地解析执行、路径、目录、复制等内容。它相当于
“C:\Program Files(x86)\Foobar\bin\my tool.exe”
""C:\Program Files (x86)\Foobar\bin"\my tool with spaces.exe"