用户与系统环境变量:系统变量会覆盖用户变量吗?

Iva*_*van 31 windows environment-variables

我对我的笔记本电脑有更高的权限,但没有管理员权限。修改系统环境变量需要管理员权限。我预计如果我创建了一个与系统环境变量同名的用户环境变量,用户变量将覆盖系统变量,但事实并非如此。

添加与系统变量同名的用户变量后,我打开了一个全新的cmd窗口,使用echo命令显示变量。它向我展示了系统变量的值而不是用户变量的值。

我只是想确认这是预期的行为并了解其背后的原因。我希望更具体的用户设置覆盖系统设置。

我有 Windows 7。

I s*_*ica 43

根据 MSKB 文章Windows NT 中的环境变量

用户环境变量......优先于系统环境变量。

一个值得注意的例外是PATH变量,它是系统变量和用户变量的组合结果:

Path 是根据系统路径构建的,可以在 System 对话框的 System Environment Variables 字段中查看。用户路径附加到系统路径。

本文还讨论了LibPathOs2LibPath变量扩展的相同异常以及如何autoexec.bat处理 中指定的异常。这些要点在当今的典型环境中可能没有多大意义。

归功于此 SO答案

  • 是否可以将用户路径置于系统路径之前? (12认同)

Jon*_*ndt 7

Twisty Impersonator他们的回答中所说的一切都是正确的。附加用户路径变量的想法已被强调,我相信这种差异的后果需要一些额外的处理。

路径 = %Path% (系统); %Path%(用户)

当你执行一个可执行程序(或任何可执行脚本,如.bat.vbs等),则无需提供完全合格的路径。

例如,要运行java,您可以输入以下任何内容:

C:/Program Files (x86)/Java/jre6/bin/java -version

java.exe -version

java -version
Run Code Online (Sandbox Code Playgroud)

第一个示例使用完全限定的路径。这将始终使用该确切路径上的 Java 版本。

第二个示例将遍历%Path%环境变量中的每个目录,查找名为java.exe. 它将运行找到的第一个,并停止搜索。如果在 上java.exe某处命名了两个文件%Path%,则仅使用找到的第一个文件。

第三个示例与第二个示例一样,将遍历 .csv 文件中列出的目录%Path%。此外,由于未提供文件扩展名,可执行文件扩展名列表会按照%PATHEXT%环境变量中指定的顺序附加到文件名。如果 上某处有多个名为java.comjava.exejava.bat等的文件%Path%,则仅使用找到的第一个文件。

您可以通过创建以下批处理文件来查看系统上的可执行路径扩展列表:

@echo off
echo %PATHEXT%
pause
Run Code Online (Sandbox Code Playgroud)

在我的机器上,这些是:

.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC;.PY

这是什么意思呢?

鲜明的对比到其他环境变量,用户路径不允许您覆盖系统路径。情况正好相反。从上面的例子来看,在很多情况下你可能会改变 Java 的默认版本。但是,如果系统路径中已经列出了 Java 版本,则该版本总是最先找到的,因为路径是按顺序搜索的,从左到右,并且用户路径附加在右侧-hand 侧,系统路径在左侧。

我该怎么办?

如果您无权访问系统环境变量,则无法使用用户路径覆盖系统路径上的默认程序。(事实上​​,一定是这样,否则某些程序会停止正常工作,并且会使您的系统被恶意软件篡改。没有人想要这样。)

相反,如果您必须使用特定版本,则必须使用完全限定的路径。

  • 是否可以将用户路径置于系统路径之前? (3认同)