详解Windows不重启使环境变量修改生效(经典)
在“我的电脑”->“属性”->“高级”->“环境变量”中增加或修改环境变量后,需重启系统才能使之生效。有没有什么方法可让它即时生效呢?下面介绍一种方法:
以修改环境变量“PATH”为例,修改完成后,进入DOS命令提示符,输入:set PATH=C: ,关闭DOS窗口。再次打开DOS窗口,输入:echo %PATH% ,可以发现“我的电脑”->“属性”->“高级”->“环境变量”中设置的 PATH 值已经生效。
不用担心DOS窗口中的修改会影响环境变量的值,DOS窗口中的环境变量只是Windows环境变量的一个副本而已。但是对副本的修改却会引发Windows环境变量的刷新,这正是我们想要的!
诡异啊,使用win+R->cmd 启动的cmd.exe 会发现在电脑属性中设置的环境变量立马生效了,在其他模式下启动的cmd却没有发生效果,怪哉!!查看了一下资料,在电脑属性中设置环境变量以后,以后启动的程序和线程会生效,而对以前驻留内存的程序不起作用,也有人说kill explorer.exe 再启动explorer.exe 可以激发设置其作用。
这里要理解的是,一个程序启动时,环境变量被复制到该程序所在的环境中,在该程序执行过程中不会被除该程序以外的其他程序所改变。也就是说,假设我们启动了一个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官方资料,文档中阐述了环境变量更改后如何即时生效的原理。
出处:
微软帮助和技术支持
http://support.microsoft.com/kb/104011/zh-cn
容内:
注:(中文版-机器翻译)机器翻译无法保证原文的正确度,中文版之后已附上英文原版
您可以通过编辑以下注册表项修改用户环境变量:
HKEY_CURRENT_USER /
Environment
,可以通过编辑以下注册表项来修改系统环境变量:
HKEY_LOCAL_MACHINE /
SYSTEM /
CurrentControlSet /
Control /
Session Manager /
Environment
注意必须作为 REG_EXPAND_SZ 注册表值在注册表中存储要扩展 (例如对于使用 %system%) 时需要的所有环境变量。不将从注册表读取时展开类型 REG_SZ 的任何值。
请注意 RegEdit.exe 没有一种添加 REG_EXPAND_SZ 的方法。 使用 RegEdt32.exe 手动编辑这些值时。
但是,请注意对环境变量所做的修改不会导致立即更改。例如对于如果对进行了更改之后启动另一个命令提示符,环境变量将反映上一个 (不在当前) 值。直到您先注销然后再次登录后,所做的更改不会生效。
若要影响这些更改,而无需注销、 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 文件并重新启动。
英文原版:
地址:http://support.microsoft.com/kb/104011/en-us/
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:
HKEY_LOCAL_MACHINE / SYSTEM / CurrentControlSet / Control / Session Manager / EnvironmentNote that any environment variable that needs to be expanded (for example, when you use %SYSTEM%) must be stored in the registry as a REG_EXPAND_SZ registry value. Any values of type REG_SZ will not be expanded when read from the registry.
Note that RegEdit.exe does not have a way to add REG_EXPAND_SZ. Use RegEdt32.exe when editing these values manually.
However, note that modifications to the environment variables do not result in immediate change. For example, if you start another Command Prompt after making the changes, the environment variables will reflect the previous (not the current) values. The changes do not take effect until you log off and then log back on.
To effect these changes without having to log off, broadcast a WM_SETTINGCHANGE message to all windows in the system, so that any interested applications (such as Windows Explorer, Program Manager, Task Manager, Control Panel, and so forth) can perform an update. For example, on Windows NT-based systems, the following code fragment should propagate the changes to the environment variables used in the Command Prompt: SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 0,
(LPARAM) "Environment", SMTO_ABORTIFHUNG,
5000, &dwReturnValue);None of the applications that ship with Windows 95 and Windows 98, including Windows Explorer and Program Manager, respond to this message. Thus, while this article can technically be implemented on Windows 95 and Windows 98, there is no effect except to notify third-party applications. The only method of changing global environment variables on Windows 95 is to modify the autoexec.bat file and reboot. APPLIES TOMicrosoft Windows Server 2003, Datacenter Edition (32-bit x86)Microsoft Windows Server 2003, Enterprise Edition (32-bit x86)Microsoft Windows Server 2003, Standard Edition (32-bit x86)Microsoft Windows Server 2003, Web EditionMicrosoft Windows XP Home EditionMicrosoft Windows XP Media Center EditionMicrosoft Windows XP ProfessionalMicrosoft Windows 2000 Advanced ServerMicrosoft Windows 2000 Datacenter ServerMicrosoft Windows 2000 Professional EditionMicrosoft Windows 2000 ServerMicrosoft Windows NT 4.0Microsoft Windows NT Server 3.51 来源 http://blog.csdn.net/lioncode/article/details/6037683
详解Windows不重启使环境变量修改生效(经典)的更多相关文章
- Windows不重启就使环境变量修改生效
以修改环境变量“PATH”为例,修改完成后,进入DOS命令提示符,输入:set PATH=C: ,关闭DOS窗口.再次打开DOS窗口,输入:echo %PATH% ,可以发现“我的电脑”->“属 ...
- postman(一):详解在postman中使用环境变量
一.定义环境变量 添加环境分支 添加环境变量 切换环境分支 使用脚本设置环境变量 设置集合级别的变量 二.使用环境变量 使用{{变量名称}}的形式引用环境变量. 注:变量可以用在URL,请求参数,请求 ...
- JAVA环境变量配置详解(Windows)
JAVA环境变量配置详解(Windows) JAVA环境变量JAVA_HOME.CLASSPATH.PATH设置详解 Windows下JAVA用到的环境变量主要有3个,JAVA_HOME.CLA ...
- 整理wmic使用,不重启变环境变量 .
整理wmic使用,不重启变环境变量 . 利用wmic修改是直接生效的:(e:\tools 是新添加的目录) wmic ENVIRONMENT where "name='path' and u ...
- pscp使用详解 Windows与Linux文件互传工具
pscp使用详解 Windows与Linux文件互传工具 pscp使用方法详解:pscp是putty安装包所带的远程文件传输工具,是一款十分常见windows与linux系统之间文件互传的工具,使用方 ...
- 详解LUA开发工具及其环境配置
LUA开发工具及其环境配置是本文要介绍的内容,主要是来了解并学习lua开发工具的使用和环境的配置,第一次接触LUA的话,就跟本人一起学习吧.看我能不能忽悠到你. LUA是语言,那么一定有编写的工具.第 ...
- Windows、Linux的环境变量
Windows操作系统 什么是环境变量?环境变量一般是指在操作系统中用来指定操作系统运行环境的一些参数,比如临时文件夹位置和系统文件夹位置等. 这点有点类似于DOS时期的默认路径,当你运行某些程序时除 ...
- MySQL 8.0.20 安装教程图文详解(windows 64位)
MySQL 8.0.20 安装教程图文详解(windows 64位) 更新时间:2020年05月09日 15:09:04 转载 作者:瘦肉粥不加糖 这篇文章主要介绍了MySQL 8.0. ...
- window下在同一台机器上安装多个版本jdk,修改环境变量不生效问题处理办法
window下在同一台机器上安装多个版本jdk,修改环境变量不生效问题处理办法 本机已经安装了jdk1.7,而比较早期的项目需要依赖jdk1.6,于是同时在本机安装了jdk1.6和jdk1.7. 安装 ...
随机推荐
- 前台返回json数据的常用方式+常用的AJAX请求后台数据方式
我个人开发常用的如下所示: 之所以像下面这样下,一是前台Ajax,二是为安卓提供接口数据 现在常用的是返回JSON数据,XML的时代一去不复返 JSON相对于XML要轻量级的多 对JSON不是十分熟悉 ...
- WIFI底座
自己贴片的51+WIFI的开发板终于到了..还是贴片的好看 美中不足的是需要改一个电阻的阻值..还有就是由于自己的8266和51单片机一块断电上电,所以如果用的USB线的质量不好就会出现 下载不了程序 ...
- security相关链接整理
token令牌 ssl协议 https协议 对称加密与非对称加密 认识ASP.NET Windows身份认证
- C# 中堆与栈的浅记
C# 中堆与栈的浅记 什么是堆和栈? 简言之.堆和栈是驻留在内存中的区域,它们的作用是帮助我们运行代码.在.Net Framework 环境下,当我们的代码运行时,内存中的堆和栈便存储了这些代码,并包 ...
- 创建一个宽高成比例的弹性div盒子
这里先提供一种,有更好的方法再补充. demo代码如下: <!DOCTYPE html> <html lang="en"> <head> < ...
- 浅谈左偏树在OI中的应用
Preface 可并堆,一个听起来很NB的数据结构,实际上比一般的堆就多了一个合并的操作. 考虑一般的堆合并时,当我们合并时只能暴力把一个堆里的元素一个一个插入另一个堆里,这样复杂度将达到\(\log ...
- Spring boot多模块(moudle)中的一个注入错误(Unable to start embedded container; nested exception is org)
org.springframework.context.ApplicationContextException: Unable to start embedded container; nested ...
- mybatis-高级结果映射之一对一
mybatis的高级结果映射可以很轻松的帮助我们处理一对一, 一对多的数据关系. 1 数据准备 1.1 数据库 创建以下的名为 mybatis 的数据库, 并在其下创建4个表. 在此就不贴出来建表的 ...
- sql文件或连接数据库反向生成pdm文件
1. File -> Reverse Engineer -> Database 2.选择sql数据库类型 mysql / sqlserver /oracle 3.using script ...
- [尝鲜]妈妈再也不用担心 dotnet core 程序发布了: .NET Core Global Tools
什么是 .NET Core Global Tools? Global Tools是.NET Core 2.1 中一个初次出现的特性.Global Tools提供了一种方法,让开发人员编写的.NET C ...