差異處

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

連向這個比對檢視

下次修改
前次修改
windowsbatch:edit_env_variable [2013/09/12 11:22]
tony 建立
windowsbatch:edit_env_variable [2023/06/25 09:48] (目前版本)
行 1: 行 1:
 +{{tag>​WindowsBatch}}
 ====== 修改環境變數 ====== ====== 修改環境變數 ======
 ===== Introduction ===== ===== Introduction =====
 操作環境變數是常遇到的議題。像安裝軟體時,為了要讓使用者可以在command line直接執行我們的程式,我們會將程式資料夾路徑加入到PATH變數中;移除軟體時就會把它從PATH中拿掉。或者我們有某些如軟體安裝目錄的資訊,希望能夠讓我們不同的程式得知,而將這個值建立到環境變數中以方便操作。接下來將針對操作環境變數的不同方法做介紹。 操作環境變數是常遇到的議題。像安裝軟體時,為了要讓使用者可以在command line直接執行我們的程式,我們會將程式資料夾路徑加入到PATH變數中;移除軟體時就會把它從PATH中拿掉。或者我們有某些如軟體安裝目錄的資訊,希望能夠讓我們不同的程式得知,而將這個值建立到環境變數中以方便操作。接下來將針對操作環境變數的不同方法做介紹。
 ===== Methods ===== ===== Methods =====
 +==== registry ====
 +輸入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%到系統環境變數中:​ 
 +<code bash> 
 +wmic ENVIRONMENT create name="​%VAR%",​username="<​system>",​VariableValue="​%VALUE%"​  
 +</​code>​ 
 +建立變數到目前使用者環境變數中:​ 
 +<code bash> 
 +wmic ENVIRONMENT create name="​%VAR%",​username="​%username%",​VariableValue="​%VALUE%"​  
 +</​code>​ 
 +如果使用者是有網域的情況,username要改為:​ 
 +<code bash> 
 +username="​%userdomain%\%username%"​ 
 +</​code>​
 === Update === === Update ===
 +將所有使用者名稱為%VAR%的環境變數修改為%VALUE%:​ 
 +<code bash> 
 +wmic ENVIRONMENT where "​name='​%VAR%'"​ set VariableValue="​%VALUE%"​ 
 +</​code>​
 === Delete === === Delete ===
 +刪除所有使用者名稱為%VAR%的環境變數:​
 +<code bash>
 +wmic ENVIRONMENT where "​name='​%VAR%'"​ delete
 +</​code>​
 +刪除系統名稱為%VAR%的環境變數:​
 +<code bash>
 +wmic ENVIRONMENT where "​name='​%VAR%'​ and username='<​system>'"​ delete
 +</​code>​
 +=== Query ===
 +取得名稱為%VAR%的環境變數,顯示所有使用者與所有欄位:​
 +<code bash>
 +wmic ENVIRONMENT where "​name='​%VAR%'"​
 +</​code>​
 +取得系統名稱為%VAR%的環境變數,僅顯示VariableValue欄位:​
 +<code bash>
 +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>​
 +別人也有提供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~~