Windows 的 cmd 下雖然有提供 [setx](https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/setx) 指令可以修改系統的環境變數, 但是它有一個要命的限制, 就是設定的值不能超過 1024 個字元, 這對一般的環境變數沒有差, 可是當你要設定 `PATH` 的時候, 就很容易超過限制。更糟的是超過限制時, 它會自動截掉超過的部分後儲存到環境變數中。 為了解決這個問題, 有善心人士寫了一個工具程式 [SetEnv](https://www.codeproject.com/Articles/12153/SetEnv), 以下我們就來說明它的用法。 ## 安裝 SetEnv SetEnv 可以下載安裝檔或是原始碼壓縮檔, 由於它是單獨的一個 exe 檔, 所以比較建議的方式就是下載原始碼壓縮檔, 從解開的 Visual Studio C++ 專案的 Release 資料夾中取出 setenv.exe 放到 c:\Windows 或任何 PATH 指定的路徑下即可。 以下指令可查看使用方法: ``` >setenv /? SetEnv - Version 1.08 - Copyright (C) 2005-2007 - Jonathan Wilkes Allows you to set/update/delete User or System Environment Variables, e.g. PATH. For Windows 9x/NT/2000/XP/S2K3/Vista Usage: SetEnv -<options> <name> <value> Options (Default is System variable, add -u for User): SetEnv -a name value Set the variable to the specified value SetEnv -a name %value Add a value to an expanded variable SetEnv -ap name %value Prepend a value to an expanded variable SetEnv -d name Delete the variable SetEnv -d name %value Delete the value from the expanded variable SetEnv -ua name Add a USER environment variable SetEnv -ud name Deletes a USER environment variable SetEnv -e Show examples of using SetEnv Return Values: 0 Success 5 Access Denied 1 Other Error (Error messages go to stderr) Notes: If you want to create an expanded variable with multiple values, e.g. PATH specify the value with a preceeding '%' character, e.g. SetEnv PATH %d:\Bin Use double quotes around any value which contains spaces. ``` ## 操作使用者的環境變數 設定環境變數: ``` >setenv -ua MEE_HOME c:\mee ``` 重啟 cmd 後可以看到環境變數的新值: ``` >echo %MEE_HOME% c:\mee ``` 使用百分比符號可以在既有的環境變數後面添加內容: ``` >setenv -ua MEE_HOME %c:\temp ``` 重啟 cmd 後可以看到它會自動幫你加上分隔的分號, 然後將內容加在最後面: ``` >echo %MEE_HOME% c:\mee;c:\temp ``` 這種以分號分隔項目的環境變數 setenv 稱為**展開 (expanded) 的環境變數**, 你也可以從展開的環境變數中刪除指定項目: ``` >setenv -ud MEE_HOME %c:\temp ``` 重啟後就會發現只剩下單一項目: ``` >echo %MEE_HOME% c:\mee; ``` 你也可以把項目新增到環境變數的開頭: ``` >setenv -uap MEE_HOME %c:\code ``` 重啟後就可以看到新增的項目: ``` >echo %MEE_HOME% c:\code;c:\mee; ``` 如果要刪除環境變數: ``` >setenv -ud MEE_HOME ``` 重啟後可以看到環境變數已經被刪除了: ``` >echo %MEE_HOME% %MEE_HOME% ``` 你也可以嵌入其它環境變數到設定值內, 但要注意使用的是 "~" 而不是 "%": ``` >setenv -ua CODE c:\code >setenv -ua PYTHON ~CODE~\python ``` 重啟後可以看到生效: ``` >echo %PYTHON% c:\code\python ``` 注意到這個嵌入是動態的, 如果你變更 CODE 的值: ``` >setenv -ua CODE d:\code ``` 重啟 cmd 後就會發現值也會跟著變化: ``` >echo %PYTHON% d:\code\python ``` ## 操作系統環境變數 要操作系統環境變數必須要以管理員身分啟動 cmd, 在 Windows Terminal 中可以按住 <kbd>Alt</kbd> 後再 + 上按滑鼠左鍵, 就可以管理員身分開啟新的 Windows Terminal。大部分的操作都跟使用者的環境變數類似, 只是選項中少掉了 'u' 而已。 設定環境變數值: ``` >setenv -a MEE_HOME c:\mee ``` 重啟查看結果: ``` >echo %MEE_HOME% c:\mee ``` 新增項目到展開的環境變數尾端: ``` >setenv -a MEE_HOME %c:\temp ``` 重啟可看到結果: ``` >echo %MEE_HOME% c:\mee;c:\temp ``` 當然也可以新增項目到展開的環境變數的開頭: ``` >setenv -ap MEE_HOME %c:\windows ``` 重啟可以看到結果, 一樣會幫你加上分隔的分號: ``` >echo %MEE_HOME% c:\windows;c:\mee;c:\temp ``` 你也可以刪除展開的環境變數裡指定的項目: ``` >setenv -d MEE_HOME %c:\temp ``` 重啟後就會發現結尾處的 "c:\temp" 被刪除了: ``` >echo %MEE_HOME% c:\windows;c:\mee; ``` 以下則會刪除開頭端的 "c:\windows": ``` >setenv -d %c:\windows ``` 重啟後的確看到刪除後的結果: ``` >echo %MEE_HOME% c:\mee; ``` 另外, 它也會幫你檢查重複的內容: ``` >setenv -a MEE_HOME %c:\temp >setenv -ap MEE_HOME %c:\temp ``` 重啟後會看到重複的內容並不會重複加入: ``` >echo %MEE_HOME% c:\mee;c:\temp ``` 一樣可以刪除環境變數: ``` >setenv -d MEE_HOME ``` 重啟後可確認的確被刪除了: ``` >echo %MEE_HOME% %MEE_HOME% ``` ## 結語 有了 SetEnv 工具程式, 就不需要使用如下的方式修改 PATH: ``` setx %PATH%;c:\code ``` 可避免路徑過長超過 1024 個字元的問題, 而是改用: ``` setenv -ua PATH %c:\code ``` 或是 ``` setenv -a PATH %c:\code ``` 將新的路徑加到使用者或系統的 PATH 環境變數尾端, 完全沒有字數限制的問題。