在Windows中,注册表项HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment\Path
包含PATH
环境变量的内容。在我的例子中,PATH
环境变量的类型为REG_EXPAND_SZ
,内容为:
%SOME_PATH%\bin;C:\Windows
此外,我有一个名为PATH
的用户环境变量,定义为:
%PATH%;C:\Users\Me\Bin
如果我在命令行输入ECHO %PATH%
,则输出为:
C:\Some\Path\bin;C:\Windows;C:\Users\Me\Bin
好的,现在针对上述场景给出了期望的结果。我想永久地在批处理脚本中添加机器的PATH
变量。更改后,我希望所有新打开的命令窗口都可以在不需要注销或重新启动的情况下获取更改,并且上述注册表值应更改为:
C:\My\Path;%SOME_PATH%\bin;C:\Windows
在网上搜索如何执行此操作会产生以下方法:
1) SETX Path "C:\My\Path;%Path%" /m
Result: C:\My\Path;C:\Some\Path\bin;C:\Windows;C:\Users\Me\Bin
The first problem with this is that it expands the %SOME_PATH% environment
variable to it's corresponding value. The second is that %Path% expands
to include the user's Path variable.
2) REG ADD "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment"^
/v Path /t REG_EXPAND_SZ /d "C:\My\Path;%%B" /f
Result: C:\My\Path;%SOME_PATH%\bin;C:\Windows
The registry value ends up being correct, but I have to log off or
restart to pick up the changes.
有没有办法在批处理文件中完成我想要做的事情?
答案 0 :(得分:1)
正如 @Harry Johnston 在评论中指出的那样,解决方案是在更改注册表值后在虚拟变量上调用SETX
。就我而言,代码更改为:
REG ADD "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment"^
/v Path /t REG_EXPAND_SZ /d "C:\My\Path;%%B" /f
SETX OS "%OS%" /M
我验证了WM_SETTINGCHANGE消息不包含已更改的环境变量的名称,因此处理该消息的客户端(例如资源管理器)必须在收到该消息时刷新所有环境变量。证明该消息只包含两个参数wParam
和lParam
,在更改环境变量时设置如下:
wParam中
当应用程序发送此消息时,此参数必须为NULL。
lParam的
要对系统或用户的环境变量进行更改,请将lParam设置为字符串" Environment"来广播此消息。