如何通过Windows中的命令行来明确修改PATHvariables

我想创build一个.bat文件,在Windows PATHvariables的值的末尾添加一些string。 警告,我希望这个更改是明确的,而不是只为当前会话工作。

有人知道一个办法吗? 尽可能多的它不应该依赖于Windows的版本

Solutions Collecting From Web of "如何通过Windows中的命令行来明确修改PATHvariables"

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

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

能够更新正在运行的进程的WM_WININICHANGE或WM_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),另一个用于控制台应用程序。

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

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

如果你想直接改变当前正在运行的进程的环境变量,那么,是的,这很复杂, 显然不推荐 :

 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并希望应用程序能够很好地将其提取出来。