Windows PATH 变量中的空格和括号会搞砸批处理文件

Windows PATH 变量中的空格和括号会搞砸批处理文件

因此,我的路径变量(System->Adv Settings->Env Vars->System->PATH)设置为:

C:\Python26\Lib\site-packages\PyQt4\bin;
%SystemRoot%\system32;
%SystemRoot%;
%SystemRoot%\System32\Wbem;
%SYSTEMROOT%\System32\WindowsPowerShell\v1.0\;
C:\Python26\;
C:\Python26\Scripts\;
C:\cygwin\bin;
"C:\PathWithSpaces\What_is_this_bullshit";
"C:\PathWithSpaces 1.5\What_is_this_bullshit_1.5";
"C:\PathWithSpaces (2.0)\What_is_this_bullshit_2.0";
"C:\Program Files (x86)\IronPython 2.6";
"C:\Program Files (x86)\Subversion\bin";
"C:\Program Files (x86)\Git\cmd";
"C:\Program Files (x86)\PuTTY";
"C:\Program Files (x86)\Mercurial";
Z:\droid\android-sdk-windows\tools;

尽管,显然,没有换行符。

注意包含以下内容的行PathWithSpaces- 第一行没有空格,第二行有一个空格,第三行有一个空格后跟一个括号。

现在,注意该批处理文件的输出:

C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\bin\>vcvars32.bat
C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\bin>"C:\Program Files (x86
)\Microsoft Visual Studio 9.0\Common7\Tools\vsvars32.bat"
Setting environment for using Microsoft Visual Studio 2008 x86 tools.
\What_is_this_bullshit_2.0";"C:\Program was unexpected at this time.
C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\bin>      set "PATH=C:\Pro
gram Files\Microsoft SDKs\Windows\v6.0A\bin;C:\Python26\Lib\site-packages\PyQt4\
bin;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\
WindowsPowerShell\v1.0\;C:\Python26\;C:\Python26\Scripts\;C:\cygwin\bin;"C:\Path
WithSpaces\What_is_this_bullshit";"C:\PathWithSpaces 1.5\What_is_this_bullshit_1
.5";"C:\PathWithSpaces (2.0)\What_is_this_bullshit_2.0";"C:\Program Files (x86)\
IronPython 2.6";"C:\Program Files (x86)\Subversion\bin";"C:\Program Files (x86)\
Git\cmd";"C:\Program Files (x86)\PuTTY";"C:\Program Files (x86)\Mercurial";Z:\dr
oid\android-sdk-windows\tools;"

或者具体来说这一行:

\What_is_this_bullshit_2.0";"C:\Program was unexpected at this time.

那么,这到底是什么鬼东西?

具体来说:

  • 路径中的目录用引号正确转义,但没有空格 = 很好
  • 路径中的目录已用引号正确转义,并且包含空格但没有括号 = 很好
  • 路径中的目录已使用引号正确转义,并且包含空格和括号 = 错误

这是怎么回事?我该如何解决这个问题?我可能会求助于连接点,让我的工具仍然能够正常工作,但如果您对此有任何见解,请告诉我 :)

答案1

如果“块”(也使用括号进行分隔)内的行中有未转义的括号,就会发生这种情况。

通常可以通过打开延迟扩展并使用 而不是 来修复此问题!var!%var%如果没有看到代码,我无法给出更多建议。

答案2

64 位系统 Windows 用户须知

Progra~1 = 'Program Files' Progra~2 = 'Program Files(x86)'

https://confluence.atlassian.com/display/DOC/Setting+the+JAVA_HOME+Variable+in+Windows

答案3

应该有 (a)不是是 MS-Windows PATH 环境变量中的任何引号(PATH 命令)或者 (b) 应该在以下表达式后面加上引号(SET 命令)不幸的是,微软对此没有很好的记录,尽管他们确实声明如果使用引号,它们将包含在变量的值中(Windows XP 命令行参考)

$ SET BLAH="blah blah(1)"
$ ECHO %BLAH%
"blah blah(1)"
$ SET BLAH=blah blah(1)
$ ECHO %BLAH%
blah blah(1)

这可能会导致不一致的问题,因此很难诊断。例如,如果您的路径包含“C:\Python27”,当您尝试执行 python 时,您的机器会说“'python' 未被识别为内部或外部命令、可操作程序或批处理文件。”但是有些库可能仍然可用。

你做不是需要“转义”空格或括号。如果需要转义特殊字符,请用引号将整个表达式括起来,包括变量名称。

SET "PATH=%PATH%;C:\Program Files (x86)\path with special characters"

或者您也可以使用括号。

(SET VAR=can't contain ampersand, parentheses, pipe, gt or lt)

注意,双引号必须成对出现。

(SET VAR=illegal characters!@#$%^*_-+={}[]\:;""',./?)
echo %VAR%
illegal characters!@#$%*_-+={}[]\:;""',./?

但是,可能没有任何字符是有效的路径名,这会导致 SET 命令出现问题。

答案4

Joey 在回答中说

如果“块”(也使用括号进行分隔)内的行中有未转义的括号,就会发生这种情况。

确实如此。如果有未转义的括号,则应该对其进行转义。这就是我所做的;我替换了

set PATH=some_path;%PATH%

set PATH="some_path;%PATH%"

这就解决了问题。

相关内容