【发布时间】: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 安装在目标计算机上。我需要添加到路径中的两个应用程序是 Perl 和 PostgreSQL,它们都包含在 Cygwin 安装中。因为我知道在这种情况下附加路径不起作用,所以我决定改为预先设置。我对此也不满意,但我无法找到一种可靠的方法在 Cygwin 条目之前插入我的路径。无法知道路径条目是“C:\Cygwin\bin”还是“%CW_DIR%\bin”,因为它实际上并未安装软件。
标签: windows batch-file windows-7 environment-variables windows-7-x64