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

mad*_*ulf 8 windows system

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

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

Ole*_*leg 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");
Run Code Online (Sandbox Code Playgroud)

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

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

如果您在注册表中更新环境并发送,SendMessage (HWND_BROADCAST, WM_SETTINGCHANGE, 0, (LPARAM)"Environment")Explorer.exe创建的新处理将具有新的环境变量,但cmd.exe将不会执行此操作.

如果您想更新当前的环境变量cmd.exe的批处理运行,你可以做以下内:您可以创建例如在%TEMP%目录t.cmd一个新的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)创建的进程,另一个用于控制台应用程序.

  • 哇,非常感谢你的详细解答.我相信它对其他民族也有价值.也就是说,当我认为在Linux中做这样的事情是多么容易时,我有点失望. (2认同)