在“我的電腦”->“屬性”->“高級”->“環境變量”中增加或修改環境變量后,需重啟系統才能使之生效。有沒有什么方法可讓它即時生效呢?下面介紹一種方法:
以修改環境變量“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