【问题标题】:Batch: How to Prepend the PATH Environment Variable批处理:如何添加 PATH 环境变量
【发布时间】:2017-02-21 21:49:21
【问题描述】:

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

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

【问题讨论】:

  • 从批处理中执行此操作的最简单方法是使用 reg add 修改注册表,然后调用 setx 更改虚拟环境变量。广播虚拟更改时,Explorer 会重新加载环境表,包括对 PATH 的更改。
  • 我强烈建议不要添加文件夹路径,而是添加文件夹路径。只有写得不好的安装程序和恶意软件应用程序会在 PATH 前面添加一个文件夹路径,如果 %SystemRoot%\System32 不再是系统 PATH 中的第一个文件夹路径,这很容易导致许多应用程序和批处理脚本不再工作,具体取决于前置文件夹路径中的可执行文件和脚本包含。有关如何将文件夹路径附加到系统 PATH 的示例,请参阅Why are other folder paths also added to system PATH with SetX? 上的答案。
  • @Mofi 不幸的是,Cygwin 安装在目标计算机上。我需要添加到路径中的两个应用程序是 PerlPostgreSQL,它们都包含在 Cygwin 安装中。因为我知道在这种情况下附加路径不起作用,所以我决定改为预先设置。我对此也不满意,但我无法找到一种可靠的方法在 Cygwin 条目之前插入我的路径。无法知道路径条目是“C:\Cygwin\bin”还是“%CW_DIR%\bin”,因为它实际上并未安装软件。

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


【解决方案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”。

【讨论】:

  • 我试过了,它把我的路径设置为 litterally "C:\My\Path;%%B" %%B 没有扩展成任何东西。这应该如何工作?
  • 我一定在 for 循环中有代码,这不是我的问题的一部分。您必须在更新变量之前获取注册表项,因此您需要在 for 循环中调用 REG QUERY 以将值填充到命名变量中。在这种情况下,命名变量是%%B
猜你喜欢
  • 2017-02-12
  • 1970-01-01
  • 2017-09-28
  • 1970-01-01
  • 2012-01-01
  • 2012-10-03
  • 2015-10-31
  • 2012-03-19
  • 1970-01-01
相关资源
最近更新 更多