【发布时间】: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_SZ。REG_SZ值首先添加到环境中,因此您知道它们始终可用于REG_EXPAND_SZ值,例如PATH。不要依赖 regedit 中呈现给您的字母顺序。值枚举顺序应视为任意顺序。 -
@orion91,控制面板环境变量对话框向所有顶级窗口广播
WM_SETTINGCHANGE消息。 Explorer 通过调用shell32!RegenerateUserEnvironment进行响应。然而,这不应该是必要的。系统启动时,系统变量应该在winlogon.exe中展开。使用调试器或进程资源管理器检查 winlogon.exe 进程的环境。
标签: windows cmd path environment-variables