某些变量不会在 Windows 系统环境变量 PATH 中扩展

App*_*ion 6 windows path environment-variables

由于某种原因,某些环境变量在系统变量中的“PATH”变量中使用时不会扩展。

例如,%SystemRoot%可以正常工作,但%WinDir%不能。%ProgramFiles%并且%ProgramFiles(x86)%也不起作用。

显然我知道我可以使用完整路径而不是变量,但这不是重点。

有任何想法吗?

这是屏幕截图/示例:

在此输入图像描述

dxi*_*xiv 5

SystemRoot按预期扩展,因为它是伪/预定义的环境变量。WinDir是一个常规环境变量,并且与其他环境变量“竞争”,例如PATH在初始化序列中一样。

\n

Raymond Chen 在Windows Confidential 中做了最好的解释:隐藏变量:“将一个环境变量嵌入到另一个环境变量中只是一个良好的操作时机问题”。引用更多:

\n
\n

这里\xe2\x80\x99是环境搭建过程是如何进行的。它大致分为四个步骤:

\n
    \n
  • 首先,系统创建一些预定义的计算机范围环境变量,例如 System\xc2\xadRoot 和 ALL\xc2\xadUSERS\xc2\xadPROFILE(但不是 COMPUTER\xc2\xadNAME 或 Program\xc2\xadFiles)。
  • \n
  • 其次,它从“环境变量”对话框的“系统”部分创建环境变量。系统环境变量定义可以使用 \xe2\x80\x9c%\xe2\x80\x9d 表示法来引用上一步中创建的预定义环境变量。例如,您可以将系统环境变量设置为 %System\xc2\xadDrive%\\Extras。系统环境完成后,Windows开始构建用户环境。
  • \n
  • 第三步是创建预定义的每用户环境变量,例如 USER\xc2\xadPROFILE 和 APP\xc2\xadDATA。与 COMPUTER\xc2\xadNAME 和 Program\xc2\xadFiles 相关的变量也在此处创建,尽管它们\xe2\x80\x99 从技术上讲是系统变量而不是每用户变量。
  • \n
  • 最后,系统创建环境变量。它们位于“环境变量”对话框的“用户”部分,可以访问前三个步骤创建的任何变量,因此您可以将用户环境变量设置为 %USER\xc2\xadPROFILE%\\Extras 或自定义系统环境变量在第二步中设置。如果用户环境变量与系统环境变量同名,则新值将替换旧值。
  • \n
\n

...

\n

一位客户在将系统 PATH 环境变量设置为 %APPDATA%;C:\\Windows 时遇到困难。他们发现最终的环境仅包含指定的文字路径(百分号和全部),而不是用 APPDATA 环境变量的值替换它。如果您仔细查看之前详细介绍的操作顺序,就会清楚为什么会发生这种情况。他们试图根据尚未定义的变量设置系统环境变量。

\n

解决方案很简单:将编辑路径从系统环境列表框移动到用户环境列表框。这样,当它想要使用 %APPDATA% 环境变量时,该变量就会在那里。

\n
\n

对于基于其他变量定义环境变量时可能的“竞争条件”的简单示例,请考虑循环情况,其中将两个系统变量定义为:

\n
bbb=%ccc%\nccc=%bbb%\n
Run Code Online (Sandbox Code Playgroud)\n

在我的 Windows 7 上,这会导致变量评估为:

\n
C:\\etc>set\n...\nbbb=%ccc%\nccc=%ccc%\n
Run Code Online (Sandbox Code Playgroud)\n

  • 当我意识到“PATH”之后按字母顺序排列的所有内容都没有在路径中扩展时,我根据经验发现了以下内容。值得编辑吗?-> 此外,SYSTEM 和 USER 环境变量似乎是按字母顺序在节中加载的,因此如果 PATH 引用 %JAVA_HOME% 和 %SCALA_HOME%,并且它们是在同一节中定义的,那么当 PATH 扩展时,它将包含 JAVA_HOME 的正确(扩展)值,但它将包含文字(未扩展)“%SCALA_HOME%”。 (5认同)
  • @shoover 感谢您提供额外的花絮。尽管如此,常规环境变量评估的确切顺序仍然没有记录,因此它可能会随着明天的下一个 Windows 版本而改变,而 MS 不会做出任何解释,因此依赖它将是一场冒险的赌博。 (2认同)