命令行使windows环境变量立即生效

文章来源:http://blog.csdn.net/huanglong8/article/details/53574040

用户变量和环境变量对于Windows系统级应用开发有着至关重要的意义。

最重要的一项功能便是我们可以通过DOS命令行或运行时指令进行本地过程调用,从而避免诸多路径相关的问题,例如冗长的路径字符串造成的溢出,短路径未设置,长路径带空格,路径前后双引号命令无效等。

对于大型集成系统而言,集成框架,集成脚本等一系列第三方应用,也需要设置很多环境变量,这一点体现在它们的doc文档或readme中,这对于集成方案是不利好的,也对用户体验是不良好的。

在最近的一次系统级产品研发中,需要解决此项问题,即是一次安装,自动设置。解决环境变量的设置,可以通过命令行,注册表来完成,但若要使其生效,需要注销或重新登录操作系统,这无疑是要解决的重要问题。

针对环境变量及相关资料可继续参考如下链接:
http://m.blog.csdn.net/article/details?id=44462313

设置环境变量可以用以下几种命令参考:

1.Reg注册表文件

Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment]
"MyTestValue"="C:\Path\Dir"

这种办法简单可行,就是不能对已存在的值进行追加,例如追加Path环境变量

2.reg命令行

reg add "HKCU\Environment" /v MyTestValue /t reg_sz /d "C:\Path\Dir" /f

具体的可参照reg /?来进行查看。
如果需要设置Path的追加值,则需要先查询Path,在进行修改。
注意这里不能用echo %path%来进行查询,因为这里的path是全部的搜索路径,即包括系统环境变量的,也包括用户环境变量的。所以正确的做法应该还是查询注册表。

:: 查询注册表项值存入到mypath临时变量中
for /f "delims=" %%i in (
'reg.exe query 
"HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" 
/v "Path"'
) do set mypath="%%i" 
:: 对mypath进行截取字符串,去除前30个字符,去除后一个字符
set mypath=%mypath:~30,-1%
:: 对mypath追加路径
set mypath=%mypath%;C:\Path\Dir
:: 重新设置并覆盖到注册表中
reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v Path /t REG_EXPAND_SZ /d "%mypath%" /f

3.wmi命令行

使用wmic命令查询较为方便,但针对如下情况:

for /f "delims=" %%i in ('wmic.exe ENVIRONMENT where "name='Path' and username='<system>'" get VariableValue') do set mypath="%%i"

进行查询赋值时,发现经过了三次赋值,最终赋值为””空而结束,在查阅了相关for循环指令后,都没能解决,感情兴趣的朋友可以试试,并分享下解决方法。执行后:
这里写图片描述
出现这个问题后,就没在忘后面写了,其实剩下的内容很简单

wmic ENVIRONMENT where "name='Path' and username='<system>'" set VariableValue="%mypath%;C:\Path\Dir"

4.立即生效设置的说明

有网友说如果是Win7以下系统,通过wmic设置后,是直接自动生效的,对于已加载的cmd或explorer当然是无法做到的。
win7以上系统wmic设置后,仍然无法立即生效,这里查阅相关资料和其他网友的研究,可以通过setx进行设置

setx Path /K "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment\Path\" /M

这个命令执行后,在新打开的cmd或explorer中,已更新的环境变量就已设置成功了。通常如果,需要在当前的cmd下也设置成功,可以补充SET Path = %mypath%即可。可针对已运行explorer或其他已打开的进程,则无能为力。

5.发送windows消息进行更新广播

关于SendMessageTimeout可参考
http://baike.baidu.com/link?url=3BJdatQNLK0rqfR5XBSFO6afozQTKl06d0O0r7ZYhoc_YxnkLxhZ_OMMDLx20SUBTjcFiSloeywG9WqS_LKvAohhdaDPDA6LAjcuCYekHma

SendMessageTimeout(HWND_BROADCAST,WM_SETTINGCHANGE,0,(LPARAM)TEXT(“Environment”),SMTO_ABORTIFHUNG,5000,&ret);

如果是Unicode编码要注意转码TEXT或L,否则无效,多字节的话强转就可以了。但是经过测试发现,只有在新启动的窗口中,新的环境变量被更新了,已运行的窗口仍然没有被更新,虽然此函数设置了通知方式为广播,但仍未生效,感兴趣的朋友可以尝试利用pid获取窗口句柄进行再测试,这里就不搞了。
经过以上各种方法尝试,设置环境变量在集成系统项目中也是举步维艰,存在bug的一步,整理了网上搜罗的资料和项目中尝试的方法,也算是功德圆满了。要搞它,这么多方法,应该总有一个可以吧,再不行,咱们就弹框让用户不爽的重启吧。

注意:
1.批处理和DOS命令,%%和%的区别。
2.C的字符编码还是要小心以下,遵照规范,否则即便使用了也不会生效。

发布了26 篇原创文章 · 获赞 18 · 访问量 3万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章