在「個人電腦」->「屬性」->「高級」->「環境變量」中增長或修改環境變量後,需重啓系統才能使之生效。有沒有什麼方法可以讓它即時生效呢?下面介紹一種方法:編程
以修改環境變量「PATH」爲例,修改完成後,進入DOS命令提示符,輸入:set PATH=C: ,關閉DOS窗口。再次打開DOS窗口,輸入:echo %PATH% ,能夠發現「個人電腦」->「屬性」->「高級」->「環境變量」中設置的 PATH 值已經生效。小程序
不用擔憂DOS窗口中的修改會影響環境變量的值,DOS窗口中的環境變量只是Windows環境變量的一個副本而已。可是對副本的修改卻會引起Windows環境變量的刷新,這正是咱們想要的!windows
詭異啊,使用win+R->cmd 啓動的cmd.exe 會發如今電腦屬性中設置的環境變量立馬生效了,在其餘模式下啓動的cmd卻沒有發生效果,怪哉!!查看了一下資料,在電腦屬性中設置環境變量之後,之後啓動的程序和線程會生效,而對之前駐留內存的程序不起做用,也有人說kill explorer.exe 再啓動explorer.exe 能夠激發設置其做用。app
這裏要理解的是,一個程序啓動時,環境變量被複制到該程序所在的環境中,在該程序執行過程當中不會被除該程序之外的其餘程序所改變。也就是說,假設咱們啓動了一個cmd程序,而後經過控制面板修改了環境變量設置,可是已經啓動了的cmd所擁有的環境變量並不會被改變。若是咱們在修改環境變量以後啓動cmd程序,則該程序將擁有新的環境變量。
那麼結論就很明顯了:修改環境變量以後,若是受影響的是應用程序,那麼只要簡單地從新啓動此應用程序,環境變量的修改就會反映到該程序中,而沒必要從新啓動計算機;可是,若是受影響的是系統服務,就必須從新啓動才能將環境變量的修改反映到系統服務中(由於沒有辦法在不重啓計算機的狀況下從新啓動系統服務管理器)。函數
方案一:修改註冊表,並向系統廣播消息this
修改Windows環境變量後不從新啓動使之當即生效的方法spa
很多程序須要添加各自的環境變量,方便定製性使用。用得最多的是用戶指定目錄如JAVA_HOME等變量,程序中能夠根據獲取變量%JAVA_HOME%,來獲取對應設置的字符串。.net
通常作法是安裝的時候就指定,或者程序中設定。線程
用批處理臨時設置環境變量就不提了,這裏講讓環境變量始終生效。翻譯
通常作法是修改環境變量註冊表。
整個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、環境變量的修改
(1)修改當前進程的某個環境變量:SetEnvironmentVariable。
(2)修改系統環境變量:在註冊表HKEY_LOCAL_MACHINESystemCurrentControlSetControlSession ManagerEnvironment中修改。
(3)修改用戶環境變量:在註冊表中HKEY_CURRENT_USEREnvironment修改。
2、環境變量的生效
在網上搜了一下,有兩種說法:
(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