修改Windows环境变量后不重新启动使之立即生效的方法

 想在Windows下通过编程修改环境变量的值,并且希望修改完后立即生效。
一、环境变量的修改
(1)修改当前进程的某个环境变量:SetEnvironmentVariable。
(2)修改系统环境变量:在注册表HKEY_LOCAL_MACHINESystemCurrentControlSetControlSession ManagerEnvironment中修改。
(3)修改用户环境变量:在注册表中HKEY_CURRENT_USEREnvironment修改。
二、环境变量的生效
在网上搜了一下,有两种说法:
(1)SendMessage(HWND_BROADCAST,WM_SETTINGCHANGE,0,(LPARAM)TEXT("Environment"));
(2)SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 0,LPARAM("Environment"), SMTO_ABORTIFHUNG, 5000, &MsgResult);
没有尝试,先记在这儿。

 

很简单:

SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 0,LPARAM("Environment"), SMTO_ABORTIFHUNG, 5000, &MsgResult);

发一个全局的广播,等待各自相应后,立即生效。

  { Note: We originally used SendNotifyMessage to broadcast the message but it
    turned out that while it worked fine on NT 4 and 2000 it didn't work on XP
    -- the string "Environment" in lParam would be garbled on the receiving
    end (why I'm not exactly sure). We now use SendMessageTimeout as directed
    in the KB article 104011. It isn't as elegant since it could cause us to
    be delayed if another app is hung, but it'll have to do. }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Windows 操作系统中,修改环境变量后需要重新打开命令行窗口或者重新启动计算机才能使修改生效。如果想要在 Python 脚本中实现修改环境变量立即生效的功能,可以使用以下方法: 1. 使用 `os.environ` 对象修改环境变量,并且使用 `ctypes` 模块调用 `SendMessage` API 发送消息给 Windows Explorer 进程,通知它更新环境变量。示例代码如下: ``` import os import ctypes # 修改环境变量 PATH new_path = os.environ['PATH'] + ';C:\\NewFolder' os.environ['PATH'] = new_path # 发送消息给 Windows Explorer 进程,通知它更新环境变量 HWND_BROADCAST = 0xFFFF WM_SETTINGCHANGE = 0x1A SMTO_ABORTIFHUNG = 0x0002 result = ctypes.windll.user32.SendMessageTimeoutW( HWND_BROADCAST, WM_SETTINGCHANGE, 0, 'Environment', SMTO_ABORTIFHUNG, 5000, None ) if result == 0: print('Failed to update environment variables') else: print('Environment variables updated successfully') ``` 在代码中,首先使用 `os.environ` 对象修改环境变量 PATH,然后使用 `ctypes` 模块调用 `SendMessage` API 发送消息给 Windows Explorer 进程,通知它更新环境变量。如果更新成功,`SendMessage` API 将返回一个非零值,否则返回零。 2. 使用 `winreg` 模块修改系统注册表中的环境变量,并且使用 `win32api` 模块调用 `SendMessage` API 发送消息给 Windows Explorer 进程,通知它更新环境变量。示例代码如下: ``` import winreg import win32api # 修改环境变量 PATH with winreg.ConnectRegistry(None, winreg.HKEY_LOCAL_MACHINE) as hkey: with winreg.OpenKeyEx(hkey, r'SYSTEM\CurrentControlSet\Control\Session Manager\Environment', 0, winreg.KEY_WRITE) as key: new_path = winreg.QueryValueEx(key, 'PATH')[0] + ';C:\\NewFolder' winreg.SetValueEx(key, 'PATH', 0, winreg.REG_EXPAND_SZ, new_path) # 发送消息给 Windows Explorer 进程,通知它更新环境变量 HWND_BROADCAST = 0xFFFF WM_SETTINGCHANGE = 0x1A SMTO_ABORTIFHUNG = 0x0002 result = win32api.SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 0, 'Environment', SMTO_ABORTIFHUNG, 5000) if result == 0: print('Failed to update environment variables') else: print('Environment variables updated successfully') ``` 在代码中,首先使用 `winreg` 模块修改系统注册表中的环境变量 PATH,然后使用 `win32api` 模块调用 `SendMessage` API 发送消息给 Windows Explorer 进程,通知它更新环境变量。如果更新成功,`SendMessage` API 将返回一个非零值,否则返回零。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值