我对我的笔记本电脑拥有提升的权限,但没有管理员权限。需要管理员权限才能修改系统环境变量。我预计,如果我创建了一个与系统环境变量同名的用户环境变量,则用户变量将覆盖系统变量,但事实并非如此。
添加与系统变量同名的用户变量后,我打开了一个全新的 cmd 窗口并使用回声命令显示变量。它显示了系统变量的值,而不是用户变量的值。
我只是想确认这是预期的行为并了解其背后的原因。我希望更具体的用户设置能够覆盖系统设置。
我有 Windows 7。
答案1
根据 MSKB 文章Windows NT 中的环境变量:
用户环境变量....优先于系统环境变量。
一个值得注意的例外是PATH
变量,它是合并系统和用户变量的结果:
该路径由系统路径构成,可以在系统对话框中的系统环境变量字段中查看。用户路径附加到系统路径。
本文还讨论了和变量扩展的相同异常LibPath
以及Os2LibPath
在中指定的异常的autoexec.bat
处理方式。这些要点在当今的典型环境中可能没有什么相关性。
感谢这个 SO回答
答案2
一切扭曲的模仿者说他们的答案是正确的。附加用户路径变量的想法已经被强调,我相信这种差异的后果需要一些额外的处理。
路径 = %Path% (系统);%Path% (用户)
当您执行可执行程序(或任何可执行脚本,例如.bat
、.vbs
等)时,您不需要提供完全限定的路径。
例如,要运行java
,您可以输入以下任意内容:
C:/Program Files (x86)/Java/jre6/bin/java -version
java.exe -version
java -version
第一个例子使用完全限定路径。这将始终使用该精确路径上的 Java 版本。
第二个示例将遍历%Path%
环境变量中的每个目录,查找名为的可执行文件java.exe
。它将运行找到的第一个文件,然后停止搜索。java.exe
如果上的某个地方有两个文件%Path%
,则只使用找到的第一个文件。
第三个示例与第二个示例类似,将迭代 中列出的目录%Path%
。此外,由于未提供文件扩展名,因此将按照环境变量中指定的顺序将可执行文件扩展名列表附加到文件名后%PATHEXT%
。如果上的某个位置有多个名为java.com
、java.exe
、等的文件,则只使用找到的第一个文件。java.bat
%Path%
您可以通过创建以下批处理文件来查看系统上的可执行路径扩展列表:
@echo off
echo %PATHEXT%
pause
在我的计算机上,这些是:
.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC;.PY
这是什么意思呢?
在与之形成鲜明对比与其他环境变量不同,用户路径不允许您覆盖系统路径。情况恰恰相反。从上面的示例中可以看出,在很多情况下您可能需要更改 Java 的默认版本。但是,如果系统路径中已经列出了 Java 版本,则始终会首先找到该版本,因为路径是按从左到右的顺序搜索的,并且用户路径附加在右侧,系统路径在左侧。
我能做什么呢?
如果您无权访问系统环境变量,则无法使用用户路径覆盖系统路径上的默认程序。(事实上,它必须无论如何,都不能这样做,否则某些程序将无法正常工作,并且会使您的系统受到恶意软件的篡改。没有人希望发生这种情况。
相反,如果您必须使用特定版本,则必须使用完全限定路径。