![为什么 Windows 无法处理 Path 中的环境变量?](https://linux22.com/image/1213111/%E4%B8%BA%E4%BB%80%E4%B9%88%20Windows%20%E6%97%A0%E6%B3%95%E5%A4%84%E7%90%86%20Path%20%E4%B8%AD%E7%9A%84%E7%8E%AF%E5%A2%83%E5%8F%98%E9%87%8F%EF%BC%9F.png)
我和我的同事拥有相同的戴尔工作站,安装了 Windows XP Professional x64 版本。
我的 Path 环境变量以以下内容开头:
%JAVA_HOME%\bin;...
我的同事的 Path 变量包含相同的目录,使用相同的环境变量指定,但它不是他的 Path 中的第一个项。
如果我访问系统属性->环境变量并更改我的JAVA_HOME变量的值,则从命令行找到的java版本会按我预期的方式更改。这将启动一个全新的控制台窗口,以确保获取更改。
但在我同事的机器上却不是这样。他继续查找以前的 Java 版本,直到他调出 Path 变量并保存它(即使他没有对其进行任何更改)。(同样,这是在启动一个全新的控制台窗口时。)
我已经在 Windows 上观察到这种不一致现象大约 6 个月了,对此非常好奇。我们办公室里的 Windows 版本太多了,所以直到现在我才有机会在两台运行完全相同操作系统版本的机器上看到这种情况。
这是什么原因造成的?为什么我的机器可以使用新的 JAVA_HOME 重新评估 Path,而他的机器却不使用新的 JAVA_HOME 重新评估 Path?
(是不是因为它不是路径中的第一个?如果是这样,那怎么可能,为什么?我会做更多的测试来检查,但我认为他现在已经厌倦了,想回去工作。)
答案1
您的路径是系统路径和用户路径的组合。此外,系统环境变量不得包含对用户环境变量的引用,任何此类引用都将不是展开。要获得所需的结果,请在用户环境变量 PATH,如果不存在则创建这样的变量。
也许一个简化的例子会更清楚。假设 SYSTEM 环境是
ProgramFiles = C:\Program Files
SystemRoot = C:\WINDOWS
PATH = %SystemRoot%\SYSTEM32
用户 JSmith 的环境是
JAVA_HOME = %ProgramFiles%\Java\bin
USERPROFILE = C:\USERS\JSmith
PATH = %JAVA_HOME%\bin;%USERPROFILE%\bin
那么最终的路径将是
C:\WINDOWS\SYSTEM32;C:\Program Files\Java\bin;C:\Users\JSmith\bin
如预期的。
答案2
检查 Windows 注册表中的此项:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SessionManager\Environment
如果需要扩展环境变量(此处:%JAVA_HOME%)
然后变量必须被设置为REG_EXPAND_SZ价值。
如果通过命令行使用 reg.exe 添加/编辑注册表值,则默认类型为 REG_SZ。使用选项指定类型 REG_EXPAND_SZ reg add /t REG_EXPAND_SZ
。
答案3
当变量扩展到包含空格的路径时,在 PATH 变量中扩展环境变量肯定会出现问题。
我们创建了自己的系统级变量,如“OUR_ROOT=c:\MyRoot”,然后在系统 PATH 中使用它,如“PATH=;%OUR_ROOT%\bin;”,然后将其正确扩展为“PATH=;c:\MyRoot\bin;”。到目前为止没有问题。
但是,在 Windows 7(32 位)上,我让产品自行安装并创建如下系统环境变量:
STUDIO_BIN=C:\program files\Company Name\Product Name 10.4\bin
并将其添加到系统 PATH 变量中:
PATH=<other path elements>;%STUDIO_BIN%;<more path elements>
但 CMD 中显示的 PATH 值包含“%STUDIO_BIN%;”,而不是扩展路径。“我的电脑”>“属性”>“高级”>“Env.Vars”中的值也未扩展。这意味着我无法运行需要该目录中的 DLL 的程序。
只需将 STUDIO_BIN(通过我的电脑>属性>高级...>环境变量)更改为没有嵌入空格的名称:
STUDIO_BIN=C:\ProductName\bin
然后重新启动 CMD 窗口,PATH 现在是:
PATH=<other path elements>;C:\ProductName\bin;<more path elements>
另一个解决方案是使用“我的电脑”>“属性”>“高级...”>“环境变量”对话框充分编辑您在 PATH 中使用的系统变量。我尝试添加一个字符并将其删除以进行“更改”,然后确定,启动了新的 CMD 提示符,但 PATH 未正确扩展。然后我尝试删除部分路径就是这样
STUDIO_BIN=C:\Program Files\Company Name
(省略“产品名称 10.4”)瞧,下一个 CMD 提示符显示 PATH 和 STUDIO_BIN 正确扩展!
奇怪的是,如果我回去并将“产品名称 10.4”添加到 STUDIO_BIN(包括在我开始处理它之前原本存在的所有空格)并且 PATH 仍然可以正确扩展。
显然,如果对其内容进行足够的更改,PATH 变量将在环境变量对话框中进行一些额外的处理,使其能够正常工作。当产品安装程序添加变量时,不会进行这些处理(安装程序可能只是直接修改了注册表中的 PATH)。
我几乎可以肯定这也是 XP 的问题。当我组装一台新的开发机器时,这个问题在 Windows 7 中再次出现。显然微软还没有解决这个问题。
显然,即使是 MS 定义的变量(如 %ProgramFiles%)也无法在 PATH 中正确扩展。
这一页如果您通过命令行或批处理文件设置 PATH,则提供了一个可能的答案。(将 SET 后的整个命令括在引号中。)我不知道我安装的产品使用什么安装程序来设置环境变量,但显然它绕过了正确扩展带有空格的路径所需的任何处理。
因此,总结一下,您可以:
将路径(并移动所有相关文件)更改为没有空格的路径,或者
编辑环境变量对话框中无法扩展的变量(对它们进行足够的更改以使它们能够正确处理 - 我不确定多少才足够)。
答案4
定义您自己的用户环境变量时,请确保 PATH 中没有空格。例如:C:\GNAT\bin;C:\GNAT\include 不起作用,因为“;”和“C:\GNAT\include”之间有空格。