为什么 Windows 不能处理 Path 中的环境变量?

ski*_*ppy 48 windows environment-variables

我和我的同事安装了相同的戴尔工作站,并安装了 Windows XP Professional x64 版本。

我的 Path 环境变量以:

%JAVA_HOME%\bin;...
Run Code Online (Sandbox Code Playgroud)

我同事的 Path 变量包含相同的目录,使用相同的环境变量指定,但它不是他的 Path 中的第一项。

如果我访问系统属性 -> 环境变量并更改我的 JAVA_HOME 变量的值,则从命令行找到的 java 版本会按我的预期更改。这是启动一个全新的控制台窗口,以确保获取更改。

但是在我同事的机器上,它没有。他继续寻找他以前的 Java 版本,直到他调出他的 Path 变量并保存它(即使他没有对其进行任何更改)。(同样,这是在启动一个全新的控制台窗口时。)

我已经观察了 Windows 上的这种不一致大约 6 个月了,并且对此非常好奇。我们办公室里有太多版本的 Windows,所以我很少有机会在运行完全相同操作系统版本的两台机器上看到这种情况,直到现在。

这是什么原因造成的?为什么他的机器不使用新的 JAVA_HOME 重新评估 Path,而我的呢?

(是不是因为这不是 Path 中的第一件事?如果是这样,那怎么可能,为什么?我会做更多的测试来检查,但我认为他现在已经受够了,想回去工作.)

JPa*_*get 41

您的路径是系统路径后跟用户路径的串联。此外,系统环境变量可能不包含对用户环境变量的引用,并且不会扩展任何此类引用。要获得所需的结果,请在用户环境变量 PATH 中插入对 %JAVA_HOME% 的引用,如果尚不存在,则创建此类变量。

也许一个简化的例子会更清楚地说明这一点。假设 SYSTEM 环境是

ProgramFiles = C:\Program Files
SystemRoot = C:\WINDOWS
PATH = %SystemRoot%\SYSTEM32
Run Code Online (Sandbox Code Playgroud)

用户JSmith的环境是

JAVA_HOME = %ProgramFiles%\Java\bin
USERPROFILE = C:\USERS\JSmith
PATH = %JAVA_HOME%\bin;%USERPROFILE%\bin
Run Code Online (Sandbox Code Playgroud)

那么结果路径将是

C:\WINDOWS\SYSTEM32;C:\Program Files\Java\bin;C:\Users\JSmith\bin
Run Code Online (Sandbox Code Playgroud)

如预期的。

  • 我的系统有一些与系统环境变量同名的用户环境变量。Echoing PATH 不会扩展它们 - 阅读本文后,我删除了重复的用户变量,因为我想知道它们是否被优先选取(但无法扩展)。这现在对我有用 - 非常感谢。:) (3认同)

cli*_*ole 20

签入此项下的 Windows 注册表:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SessionManager\Environment
Run Code Online (Sandbox Code Playgroud)

如果需要扩展环境变量(这里:%JAVA_HOME%)

那么变量必须设置为REG_EXPAND_SZ值。

如果通过命令行使用 reg.exe 添加/编辑注册表值,则默认键入 REG_SZ。使用该reg add /t REG_EXPAND_SZ选项指定类型 REG_EXPAND_SZ 。


小智 9

当变量扩展到包含空格的路径时,在 PATH 变量中扩展环境变量肯定会出现问题。

我们创建了自己的系统级变量,如“OUR_ROOT=c:\MyRoot”,然后在系统路径中使用它,如“PATH=;%OUR_ROOT%\bin;” 并且正确扩展为“PATH=;c:\MyRoot\bin;”。到目前为止没有问题。

但是,在 Windows 7(32 位)上,我自己安装了一个产品并创建了如下系统环境变量:

STUDIO_BIN=C:\program files\Company Name\Product Name 10.4\bin
Run Code Online (Sandbox Code Playgroud)

并将其添加到系统 PATH 变量中:

PATH=<other path elements>;%STUDIO_BIN%;<more path elements>
Run Code Online (Sandbox Code Playgroud)

但是 CMD 中显示的 PATH 值包含“%STUDIO_BIN%;” 而不是扩展路径。我的电脑 > 属性 > 高级 > Env.Vars 中的值也未展开。这意味着我无法在该目录中运行需要 DLL 的程序。

只需将 STUDIO_BIN(通过我的电脑>属性>高级...>环境变量)更改为没有嵌入空格的名称:

STUDIO_BIN=C:\ProductName\bin
Run Code Online (Sandbox Code Playgroud)

然后重新启动 CMD 窗口,PATH 现在是:

PATH=<other path elements>;C:\ProductName\bin;<more path elements>
Run Code Online (Sandbox Code Playgroud)

另一种解决方案是使用“我的电脑”>“属性”>“高级...”>“环境变量”对话框充分编辑您在 PATH 中使用的系统变量。我尝试添加一个字符并将其删除以进行“更改”,然后确定退出,启动了一个新的 CMD 提示并且 PATH 未正确扩展。然后我尝试删除路径的一部分,所以它是

STUDIO_BIN=C:\Program Files\Company Name
Run Code Online (Sandbox Code Playgroud)

(省略“产品名称 10.4”),瞧,下一个 CMD 提示显示 PATH 并正确扩展了 STUDIO_BIN!

奇怪的是,如果我返回并将“产品名称 10.4”添加到 STUDIO_BIN(包括在我开始使用它之前最初存在的所有空间)并且 PATH 仍然正确扩展。

显然,对其内容进行了足够多的更改后,PATH 变量会在环境变量对话框中进行一些额外的处理,使其能够正常工作。产品安装程序添加变量时未完成的处理(可能只是直接修改了注册表中的 PATH)。

我几乎肯定这也是 XP 的问题。当我组装一台新的开发机器时,它刚刚在 Windows 7 中重新出现。显然它没有被微软修复。

显然,即使像 %ProgramFiles% 这样的 MS 定义的变量也不会在 PATH 中正确扩展。

如果您通过命令行或批处理文件设置 PATH,此页面提供了一个可能的答案。(将 SET 后的整个命令用引号括起来。)我不知道我安装的产品用于设置环境变量的安装程序,但它显然绕过了正确扩展带空格的路径所需的任何处理。

所以 - 总而言之,您可以:

  • 将路径(并移动所有相关文件)更改为没有空格的路径,或者

  • 编辑无法在环境变量对话框中扩展的变量(将它们更改到足以让它们正确处理 - 我不确定多少就足够了)。


小智 5

有两个级别的环境变量,全局和用户。如果他将 %Java_home% 设置为用户环境变量,但正在更改全局变量,他将看不到任何区别。


归档时间:

查看次数:

83109 次

最近记录:

5 年,10 月 前