【问题标题】:CMD enviroment variables not expanded in PATH variableCMD 环境变量未在 PATH 变量中展开
【发布时间】:2023-03-31 00:20:02
【问题描述】:

我在我的系统偏好设置(Windows 8.1)中设置了一些环境变量。如果我启动 cmd.exe 并执行以下命令:

C:\Users\Carlo>echo %GRAILS_HOME%
D:\Grails

C:\Users\Carlo>echo %GRADLE_HOME%
D:\Gradle

C:\Users\Carlo>echo %GROOVY_HOME%
D:\Groovy

C:\Users\Carlo>echo %PATH%
C:\ProgramData\Oracle\Java\javapath;c:\Program Files (x86)\Intel\iCLSClient\;
c:\Program Files\Intel\iCLS Client\;C:\Windows\system32;C:\Windows;
C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;
C:\Program Files\Intel\Intel(R) Management Engine Components\DAL;
C:\Program Files\Intel\Intel(R) Management Engine Components\IPT;
C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\DAL;
C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\IPT;
C:\Program Files\Intel\WiFi\bin\;C:\Program Files\Common Files\Intel\WirelessCommon\;
C:\Program Files (x86)\Brackets\command;%GRAILS_HOME%\bin;%GRADLE_HOME%\bin;
%GROOVY_HOME%\bin

为什么最后三个变量没有在 PATH 中展开?

完整的PATH变量是:

C:\ProgramData\Oracle\Java\javapath;c:\Program Files (x86)\Intel\iCLS Client\;c:\Program Files\Intel\iCLS Client\;%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;%SYSTEMROOT%\System32\WindowsPowerShell\v1.0\;C:\Program Files\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files\Intel\Intel(R) Management Engine Components\IPT;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\IPT;C:\Program Files\Intel\WiFi\bin\;C:\Program Files\Common Files\Intel\WirelessCommon\;C:\Program Files (x86)\Brackets\command;%GRAILS_HOME%\bin;%GRADLE_HOME%\bin;%GROOVY_HOME%\bin

【问题讨论】:

  • 它们是用户变量还是系统变量?见stackoverflow.com/a/13184614/886887
  • 如果在用户环境中将PATH定义为REG_EXPAND_SZ(即HKCU\Environment),则可以引用REG_SZ用户环境值。 winlogon.exe 会将用户PATH 附加到系统PATH。这也适用于编译器的LIBPATH,但由于某种原因不适用于链接器的LIB。由于历史原因,它也适用于 OS2LIBPATH,即使 OS/2 子系统早在 Windows 2000 中就已被删除。
  • @HarryJohnston Johnston GRAILS_HOME、GRADLE_HOME 和 GROOVY_HOME 都是系统变量
  • @orion91,检查reg query "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment"。 (系统变量在此注册表项中定义,因为会话管理器 smss.exe 在启动 winlogon.exe 之前首先加载它们。)确保将 GRAILS 值定义为 REG_SZ,而不是 REG_EXPAND_SZREG_SZ 值首先添加到环境中,因此您知道它们始终可用于REG_EXPAND_SZ 值,例如PATH。不要依赖 regedit 中呈现给您的字母顺序。值枚举顺序应视为任意顺序。
  • @orion91,控制面板环境变量对话框向所有顶级窗口广播WM_SETTINGCHANGE 消息。 Explorer 通过调用shell32!RegenerateUserEnvironment 进行响应。然而,这不应该是必要的。系统启动时,系统变量应该在winlogon.exe中展开。使用调试器或进程资源管理器检查 winlogon.exe 进程的环境。

标签: windows cmd path environment-variables


【解决方案1】:

环境变量(EnvVars)就是它们的名字状态:variables;它们有一个名称和一个值(在 Windows 中,该值是一个字符串)。

所以在您的示例中,名称是PATH,值是您列出的字符串。操作系统(命令解释器)对 EnvVar 值的语义一无所知,因此当它扩展 var 名称时,它只会显示其值。它不分析值并递归扩展可能存在的任何其他变量。

如果在其他变量中定义变量(我不建议这样做),则消费者的工作是扩展所有变量。

处理 EnvVars 的常用 C 函数(也许这会有所帮助):ExpandEnvironmentStrings

【讨论】:

  • 所以我不能在我的 PATH 中使用环境变量?正确的?只有一个问题...为什么 %SystemRoot% 变量在 PATH 变量中正确展开?
  • Harry Johnston 是对的,我所说的一切都只适用于 user EnvVars。似乎对于系统 EnvVar,它们递归扩展(我尝试了多达 3 个嵌套级别)。很抱歉造成混乱。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-03-07
  • 2019-05-15
  • 2021-09-18
  • 1970-01-01
  • 2019-06-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多