我拥有笔记本电脑的升级权限,但没有管理员权限。需要管理员权限才能修改系统环境变量。我希望如果创建的用户环境变量的名称与系统环境变量的名称相同,则该用户变量将覆盖系统变量,但事实并非如此。
添加与系统变量同名的用户变量后,我打开了一个全新的cmd窗口,并使用echo命令显示了该变量。它向我显示了系统变量的值,而不是用户变量的值。
我只是想确认这是预期的行为,并了解其背后的原因。我希望更具体的用户设置可以覆盖系统设置。
我有Windows 7。
我拥有笔记本电脑的升级权限,但没有管理员权限。需要管理员权限才能修改系统环境变量。我希望如果创建的用户环境变量的名称与系统环境变量的名称相同,则该用户变量将覆盖系统变量,但事实并非如此。
添加与系统变量同名的用户变量后,我打开了一个全新的cmd窗口,并使用echo命令显示了该变量。它向我显示了系统变量的值,而不是用户变量的值。
我只是想确认这是预期的行为,并了解其背后的原因。我希望更具体的用户设置可以覆盖系统设置。
我有Windows 7。
Answers:
根据MSKB文章Windows NT中的环境变量:
用户环境变量...优先于系统环境变量。
一个值得注意的例外是PATH
变量,它是系统变量和用户变量的组合结果:
路径是从系统路径构建的,可以在“系统”对话框的“系统环境变量”字段中查看。用户路径被追加到系统路径。
本文还讨论了LibPath
和Os2LibPath
变量扩展的相同异常,以及如何autoexec.bat
处理中指定的异常。在当今的典型环境中,这些观点可能没有什么意义。
归功于这个答案
Twisty Impersonator在回答中所说的一切都是正确的。附加了用户路径变量的想法已得到强调,我相信这种差异的后果需要进一步处理。
路径=%路径%(系统);%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版本,则始终会首先找到该版本,因为从左到右依次搜索路径,并且在右侧附加了用户路径。 -左侧,系统路径在左侧。
如果您无权访问系统环境变量,则无法使用用户路径覆盖系统路径上的默认程序。(实际上,一定是这种方式,否则某些程序将无法正常运行,这将使您的系统容易受到恶意软件的篡改。没人希望那样。)
相反,如果必须使用特定版本,则必须使用标准路径。