答案1
SystemRoot
由于它是一个伪/预定义环境变量,因此按预期扩展。是一个常规环境变量,并且像在初始化序列中WinDir
一样与其他变量“竞争” 。PATH
Raymond Chen 对此进行了最详细的解释Windows 机密:隐藏的变量:”将一个环境变量嵌入另一个环境变量仅仅是一个良好的操作时机问题“。更多引述:
环境构建过程的工作原理如下。它大致分为四个步骤:
- 首先,系统创建一些预定义的机器范围的环境变量,例如 SystemRoot 和 ALLUSERSPROFILE(但不是 COMPUTERNAME 或 ProgramFiles)。
- 其次,它从“环境变量”对话框的“系统”部分创建环境变量。系统环境变量定义可以使用“%”符号来引用上一步中创建的预定义环境变量。例如,您可以将系统环境变量设置为 %SystemDrive%\Extras。系统环境完成后,Windows 开始构建用户环境。
- 第三步是创建预定义的每个用户环境变量,例如 USERPROFILE 和 APPDATA。COMPUTERNAME 和 ProgramFiles 相关变量也在这里创建,尽管它们在技术上是系统变量而不是每个用户变量。
- 最后,系统创建环境变量。这些变量位于“环境变量”对话框的“用户”部分,可以访问前三个步骤创建的任何变量,因此您可以将用户环境变量设置为 %USERPROFILE%\Extras 或第二步中设置的自定义系统环境变量。如果用户环境变量与系统环境变量同名,则新值将替换旧值。
...
一位客户在将系统 PATH 环境变量设置为 %APPDATA%;C:\Windows 时遇到了困难。他们发现最终环境仅包含指定的文字路径(百分号等),而不是将其替换为 APPDATA 环境变量的值。如果您查看前面详述的操作顺序,就会明白为什么会发生这种情况。他们试图根据尚未定义的变量设置系统环境变量。
解决方案很简单:将 PATH 的编辑从系统环境列表框移至用户环境列表框。这样,当它想要使用 %APPDATA% 环境变量时,该变量就会出现在那里。
举一个基于其他变量定义环境变量时可能出现的“竞争条件”的简单例子,考虑循环情况,其中定义两个系统变量如下:
bbb=%ccc%
ccc=%bbb%
在我的 Windows 7 上,这会导致变量的计算结果为:
C:\etc>set
...
bbb=%ccc%
ccc=%ccc%