命令行使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萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章