详解Windows不重启使环境变量修改⽣效(经典)
在“我的电脑”->“属性”->“⾼级”->“环境变量”中增加或修改环境变量后,需重启系统才能使之⽣效。有没有什么⽅法可让它即时⽣效呢?下⾯介绍⼀种⽅法:
  以修改环境变量“PATH”为例,修改完成后,进⼊DOS命令提⽰符,输⼊:set PATH=C: ,关闭DOS窗⼝。再次打开DOS窗⼝,输⼊:echo %PATH% ,可以发现“我的电脑”->“属性”->“⾼级”->“环境变量”中设置的 PATH 值已经⽣效。
  不⽤担⼼DOS窗⼝中的修改会影响环境变量的值,DOS窗⼝中的环境变量只是Windows环境变量的⼀个副本⽽已。但是对副本的修改却会引发Windows环境变量的刷新,这正是我们想要的!
诡异啊,使⽤win+R->cmd 启动的 会发现在电脑属性中设置的环境变量⽴马⽣效了,在其他模式下启动的cmd却没有发⽣效果,怪哉!!查看了⼀下资料,在电脑属性中设置环境变量以后,以后启动的程序和线程会⽣效,⽽对以前驻留内存的程序不起作⽤,也有⼈说 再启动 可以激发设置其作⽤。
这⾥要理解的是,⼀个程序启动时,环境变量被复制到该程序所在的环境中,在该程序执⾏过程中不会被除该程序以外的其他程序所改变。也就是说,假设我们启动了⼀个cmd程序,然后通过控制⾯板修改
了环境变量设置,但是已经启动了的cmd所拥有的环境变量并不会被改变。如果我们在修改环境变量之后启动cmd程序,则该程序将拥有新的环境变量。
那么结论就很明显了:修改环境变量之后,如果受影响的是应⽤程序,那么只要简单地重新启动此应⽤程序,环境变量的修改就会反映到该程序中,⽽不必重新启动计算机;但是,如果受影响的是系统服务,就必须重新启动才能将环境变量的修改反映到系统服务中(因为没有办法在不重启计算机的情况下重新启动系统服务管理器)。
⽅案⼀:修改注册表,并向系统⼴播消息
修改Windows环境变量后不重新启动使之⽴即⽣效的⽅法
不少程序需要添加各⾃的环境变量,⽅便定制性使⽤。⽤得最多的是⽤户指定⽬录如JAVA_HOME等变量,程序中可以根据获取变
量%JAVA_HOME%,来获取对应设置的字符串。
⼀般做法是安装的时候就指定,或者程序中设定。
⽤批处理临时设置环境变量就不提了,这⾥讲让环境变量始终⽣效。
⼀般做法是修改环境变量注册表。
整个Windows都有效的环境变量在
HKEY_LOCAL_MACHINESYSTEMControlSet001ControlSession ManagerEnvironment
中设置
对当前⽤户有效的环境变量在
HKEY_CURRENT_USEREnvironment
中设置
其实只是简单的元数据
但往往修改玩后⽆法即时⽣效,往往需要重启系统。
要解决即时⽣效的问题,可以再在我的电脑属性中设置环境变量中确定⼀下即可。
依此看来,这个过程肯定是读取了注册表,再调⽤⼀个系统函数来更新整个系统的变量。⼀定可以编程解决的。
可惜⽹海茫茫,收不到。
⼀不做⼆不休,直接下载打开innosetup的代码,搜索Environment,果真到了。
很简单:
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. }
⽅案⼆:在⾼级属性中设置完毕后,在任意cmd下设置⼀次path的值,达到全局⼴播的⽬的
让环境变量⽣效不需重启Windows
很多安装程序在安装完成后并不要求重启Windows,⽽新的环境变量已经⽣效了,可见在不重启Windows的情况下让环境变量⽣效是完全可⾏的。
可我搜索如何不需重启Windows让环境变量⽣效的⽅法,只到三类⽅案:
下载⼀个专门的软件
编个⼩程序
修改注册表
我既然是个懒得重启Windows的⼈,难道我会不厌其烦按上述三种⽅法去做吗?没办法,我只有⾃⼰摸索。最后到⼀个⾮常简单的在Windows下直接让环境变量⽣效的办法:
先到我的电脑>属性>⾼级>环境变量,添加新环境变量或修改已有的环境变量,然后运⾏“DOS命令提
⽰符”或run cmd,假设要修改PATH变量,不管PATH的原值是什么,在DOS窗⼝直接把PATH修改为任意值,如:输⼊:set PATH=C:,关闭DOS窗⼝。再次打开DOS窗⼝,输⼊:echo %PATH% ,这时可以发现,我的电脑>属性>⾼级>环境变量⾥PATH已经在Windows全局⽣效了。
不⽤担⼼在DOS窗⼝的修改会影响我的电脑>属性>⾼级>环境变量⾥的修改,DOS窗⼝的环境变量只是Windows环境变量的⼀个副本,副本的改动不会影响正本,但会触发正本的刷新,这正是我想要的——让环境变量⽣效。
⽅案三:
修改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);
没有尝试,先记在这⼉。
==========================================================================================
下⾯是⽹阅的Windows官⽅资料,⽂档中阐述了环境变量更改后如何即时⽣效的原理。
出处:
微软帮助和技术⽀持
容内:
注:(中⽂版-机器翻译)机器翻译⽆法保证原⽂的正确度,中⽂版之后已附上英⽂原版
您可以通过编辑以下注册表项修改⽤户环境变量:
HKEY_CURRENT_USER /
Environment
环境变量path误删有影响吗,可以通过编辑以下注册表项来修改系统环境变量:
HKEY_LOCAL_MACHINE /
SYSTEM /
CurrentControlSet /
Control /
Session Manager /
Environment
注意必须作为 REG_EXPAND_SZ 注册表值在注册表中存储要扩展(例如对于使⽤ %system%)时需要的所有环境变量。不将从注册表读取时展开类型 REG_SZ 的任何值。
请注意 没有⼀种添加 REG_EXPAND_SZ 的⽅法。使⽤ ⼿动编辑这些值时。
但是,请注意对环境变量所做的修改不会导致⽴即更改。例如对于如果对进⾏了更改之后启动另⼀个命令提⽰符,环境变量将反映上⼀个(不在当前) 值。直到您先注销然后再次登录后,所做的更改不会⽣效。
若要影响这些更改,⽽⽆需注销、 WM_SETTINGCHANGE 向⼴播消息的所有窗⼝在系统中,因此,任何感兴趣的应⽤程序(如Windows 资源管理器、程序管理器、任务管理器、控制⾯版和等中)可以执⾏更新。
例如对于基于 Windows NT 的系统上下⾯的代码段应传播在命令提⽰符中使⽤的环境变量所做的更改:
SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 0,
(LPARAM) "Environment", SMTO_ABORTIFHUNG,
5000, &dwReturnValue);
⽆附带 Windows 95 和 Windows 98,包括 Windows 资源管理器和项⽬经理的应⽤程序的响应此消息。这样,Windows 95 和 Windows 98 上,从技术上讲是可以实现这篇⽂章时,除了要通知的第三⽅应⽤程序不起作⽤。更改在 Windows 95 的全局环境变量的唯⼀⽅法是修改 autoexec.bat ⽂件并重新启动。
英⽂原版:
How to propagate environment variables to the system
You can modify user environment variables by editing the following Registry key: HKEY_CURRENT_USER / Environment
You can modify system environment variables by editing the following Registry key:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。