差異處

這裏顯示兩個版本的差異處。

連向這個比對檢視

Both sides previous revision 前次修改
下次修改
前次修改
windowsbatch:edit_env_variable [2013/09/12 16:20]
tony
windowsbatch:edit_env_variable [2023/06/25 09:48] (目前版本)
行 1: 行 1:
 +{{tag>​WindowsBatch}}
 ====== 修改環境變數 ====== ====== 修改環境變數 ======
 ===== Introduction ===== ===== Introduction =====
行 4: 行 5:
 ===== Methods ===== ===== Methods =====
 ==== registry ==== ==== registry ====
-==== setx ====+輸入regedit打開註冊檔編輯器。修改目前使用者環境變數:​ 
 +<​code>​ 
 +HKEY_CURRENT_USER\Environment 
 +</​code>​ 
 +修改系統環境變數:​ 
 +<​code>​ 
 +KEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment 
 +</​code>​ 
 +Command line: 
 +<code bash> 
 +REM 設定環境變數TEST為%PATH%的內容 
 +reg add "​HKEY_CURRENT_USER/​Environment"​ /v TEST /t REG_EXPAND_SZ /d "​%PATH%"​ /f 
 +REM 設定環境變數TEST為%PATH% 
 +reg add "​HKEY_CURRENT_USER/​Environment"​ /v TEST /t REG_EXPAND_SZ /d ^%PATH^% /f 
 +REM 刪除環境變數TEST 
 +reg delete "​HKEY_CURRENT_USER/​Environment"​ /v TEST /f 
 +</​code>​ 
 +修改後不會立即生效。 
 +==== setx.exe ==== 
 +微軟提供修改環境變數的程式。可以直接參考命令說明:​ [[http://​technet.microsoft.com/​en-us/​library/​cc755104(v=ws.10).aspx|link]]。修改完後效果與直接修改系統>​進階系統設定>​系統環境變數的效果相同。
 ==== wmic ==== ==== wmic ====
-操作WMI介面的Command line工具。使用這個方法可以讓各個正在執行的程式立即取到最新的環境變數,包含Service+操作WMI介面的Command line工具。根據網路上人家所說使用這個方法可以讓各個正在執行的程式立即取到最新的環境變數,但經過我測試僅WinXP可以,其餘是不行的,除非也是透過wmi去取得環境變數內容(測試過XP,​ 2003, 2008, Win7, 2012)
 === Create === === Create ===
 建立變數%VAR%值%VALUE%到系統環境變數中:​ 建立變數%VAR%值%VALUE%到系統環境變數中:​
行 16: 行 36:
 wmic ENVIRONMENT create name="​%VAR%",​username="​%username%",​VariableValue="​%VALUE%" ​ wmic ENVIRONMENT create name="​%VAR%",​username="​%username%",​VariableValue="​%VALUE%" ​
 </​code>​ </​code>​
-建立變數到目前使用者環境變數中(有網域):+如果使用者有網域的情況,username要改為:
 <code bash> <code bash>
-wmic ENVIRONMENT create name="​%VAR%",​username="​%userdomain%\%username%",​VariableValue="​%VALUE%" ​+username="​%userdomain%\%username%"​
 </​code>​ </​code>​
 === Update === === Update ===
行 37: 行 57:
 取得名稱為%VAR%的環境變數,顯示所有使用者與所有欄位:​ 取得名稱為%VAR%的環境變數,顯示所有使用者與所有欄位:​
 <code bash> <code bash>
-wmic ENVIRONMENT where 'name="%VAR%"'+wmic ENVIRONMENT where "name='%VAR%'"
 </​code>​ </​code>​
 取得系統名稱為%VAR%的環境變數,僅顯示VariableValue欄位:​ 取得系統名稱為%VAR%的環境變數,僅顯示VariableValue欄位:​
 <code bash> <code bash>
-wmic ENVIRONMENT where 'name="%VAR%" ​and username='<​system>'​ get VariableValue+wmic ENVIRONMENT where "name='%VAR%' ​and username='<​system>'​" ​get VariableValue 
 +</​code>​ 
 +==== Changed Notification ==== 
 +由於registry與wmic的方法並不像setx的效果,會去通知其它程式環境變數的改變。因此可以透過底下Windows API達到通知的效果,當然程式也是要重啟的。 
 +<code cpp> 
 +#include <​windows.h>​ 
 +#include <​iostream>​ 
 +using namespace std; 
 + 
 +int main(int argc, char* argv[]) 
 +
 + LPDWORD MsgResult = 0; 
 + SendMessageTimeout(HWND_BROADCAST,​ WM_SETTINGCHANGE,​ 0, 
 + LPARAM("​Environment"​),​ SMTO_ABORTIFHUNG,​ 5000, MsgResult);​ 
 + cout  << MsgResult << endl; 
 + return 0; 
 +}
 </​code>​ </​code>​
 +別人也有提供taskkill explorer.exe在重新啟動的方法,但這樣做似乎...僅能用於測試上。
 ===== Reference ===== ===== Reference =====
   * [[http://​blog.csdn.net/​apextrace/​article/​details/​7616850|DOS永久设置系统环境变量-WMIC]]   * [[http://​blog.csdn.net/​apextrace/​article/​details/​7616850|DOS永久设置系统环境变量-WMIC]]
   * [[http://​blog.csdn.net/​wq1282/​article/​details/​5390313|批处理解决环境变量的问题]]   * [[http://​blog.csdn.net/​wq1282/​article/​details/​5390313|批处理解决环境变量的问题]]
 +  * [[http://​technet.microsoft.com/​en-us/​library/​cc755104(v=ws.10).aspx|M$ Setx]]
 +  * [[http://​serverfault.com/​questions/​37120/​windows-environment-variables-default-user-vs-system|環境變數註冊檔]]
 +  * [[http://​blog.csdn.net/​lioncode/​article/​details/​6037683|如何使windows系统环境变量的改变即时生效]]
 +=====    =====
 +----
 +\\
 +~~DISQUS~~