SetEnv 工具程式
Tags: cmd, bat
Published: 2024-01-31 01:51:48

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 環境變數尾端, 完全沒有字數限制的問題。