批处理:如何预先添加PATH环境变量

时间:2016-10-12 22:55:51

标签: windows batch-file windows-7 environment-variables windows-7-x64

在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.

有没有办法在批处理文件中完成我想要做的事情?

1 个答案:

答案 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消息不包含已更改的环境变量的名称,因此处理该消息的客户端(例如资源管理器)必须在收到该消息时刷新所有环境变量。证明该消息只包含两个参数wParamlParam,在更改环境变量时设置如下:

  

wParam中
  当应用程序发送此消息时,此参数必须为NULL。

   lParam的
  要对系统或用户的环境变量进行更改,请将lParam设置为字符串" Environment"来广播此消息。