如何通过Windows中的命令行明确修改PATH变量

时间:2010-09-03 13:11:47

标签: windows system

我想创建一个.bat文件,它会在Windows PATH变量值的末尾添加一些字符串。警告,我希望此更改是确定的,不仅适用于当前会话。

有人知道这样做的方法吗?它应尽可能不依赖于Windows的版本

2 个答案:

答案 0 :(得分:20)

很抱歉答案很长,但对你的问题的简短回答是不可能的。

首先,您应该了解环境变量的工作原理。注册表中有一些地方,如HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\EnvironmentHKEY_CURRENT_USER\Environment,其中将保留环境变量。在启动时,操作系统读取此注册表项。然后一个Windows进程创建另一个Windows进程。父进程可以向客户端进程提供任何环境变量集。如果父进程不这样做,子进程将继承父进程的环境变量。

能够根据WM_WININICHANGEWM_SETTINGCHANGE消息更新正在运行的进程的环境变量。 Windows应用程序可以解释此消息,并从注册表HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\EnvironmentHKEY_CURRENT_USER\Environment重新读取当前环境变量。因此,您通常可以更改HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\EnvironmentHKEY_CURRENT_USER\Environment下的注册表值并发送

SendMessage (HWND_BROADCAST, WM_SETTINGCHANGE, 0, (LPARAM)"Environment");

使用SendMessageTimeout代替SendMessage会好得多,但这个想法会保持不变。问题是其他进程必须等待消息并执行某些操作。大多数控制台应用程序没有消息循环,如果您发送此类消息,则不会执行任何操作。

因此,了解在不重新启动计算机的情况下更新所有进程的环境变量的简单方法非常重要。你应该清楚地了解这一点并稍微减少你的问题。

如果您在注册表中更新环境并发送SendMessage (HWND_BROADCAST, WM_SETTINGCHANGE, 0, (LPARAM)"Environment"),则 Explorer.exe 创建的新处理将包含新的环境变量,但 cmd.exe 不会这样做。

如果要在批处理运行中更新当前 cmd.exe 的环境变量,可以执行以下操作:您可以在%TEMP%目录中创建新的CMD文件,例如t.cmd ,写入文件SET PATH=%PATH%;C:\BlaBla,然后使用call %TEMP%\t.cmddell %TEMP%\t.cmd更新当前 cmd.exe 的环境变量。

确切地说,有更多的地方用于构建新创建的流程的环境变量。这是密钥HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths%SystemRoot%\System32\autoexec.nt文件的子密钥。一个用于由ShellExecuteShellExecuteEx(例如Explorer.exe)创建的进程,另一个用于控制台应用程序。

答案 1 :(得分:4)

如果您只关心新的流程实例,并且您真的希望通过批处理文件来完成,那么setx就是您正在寻找的。

  • /M会更改PATH中的HKEY_LOCAL_MACHINE而不是HKEY_CURRENT_USER
    即系统变量,而不是用户的 例如:SETX /M PATH "%PATH%;C:\your path with spaces"

如果你想直接更改当前正在运行的进程的环境变量,那么,那是复杂的apparently not recommended

Altering the environment variables of a child process during process creation 
is the only way one process can directly change the environment variables of 
another process. A process can never directly change the environment variables 
of another process that is not a child of that process.

否则,就像Oleg所说的那样,以编程方式最好的方法是更改​​注册表并发送WM_SETTINGCHANGE,并希望应用程序足够好用来接收它。