window修改環境變量後及時生效

 詳解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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章