我想制作一个.bat文件,它会在Windows PATH变量值的末尾添加一些字符串.警告,我希望此更改是确定的,不仅适用于当前会话.
有人知道这样做的方法吗?它应尽可能不依赖于Windows的版本
Ole*_*leg 20
对不起,答案很长,但对你的问题的简短回答是不可能的.
首先,您应该了解环境变量的工作原理.注册表中有一些地方HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment
和HKEY_CURRENT_USER\Environment
环境变量将被保存在哪里.在启动时,操作系统读取此注册表项.然后一个Windows进程创建另一个Windows进程.父进程可以向客户端进程提供任何环境变量集.如果父进程不这样做,子进程将继承父进程的环境变量.
能够根据WM_WININICHANGE或WM_SETTINGCHANGE消息更新正在运行的进程的环境变量.Windows应用程序可以解释该消息并重新读取从注册表当前的环境变量HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment
和HKEY_CURRENT_USER\Environment
.因此,您通常可以更改HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment
或HKEY_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.cmd
和dell %TEMP%\t.cmd
来更新当前cmd.exe的环境变量.
确切地说,有更多的地方用于构建新创建的流程的环境变量.这是密钥HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths
和%SystemRoot%\System32\autoexec.nt
文件的子密钥.一个将用于ShellExecute
和ShellExecuteEx
(例如Explorer.exe)创建的进程,另一个用于控制台应用程序.
归档时间: |
|
查看次数: |
16336 次 |
最近记录: |