【解決方案】Windows 環境變數太大,無法編輯與儲存

0 Comments

在 Windows 編輯環境變數,遇到了超出 2047 字元長度限制而無法儲存,一時之間是有些苦惱,難不成要縮減已經存在的內容了嗎?

在 Windows 編輯環境變數,儲存時跳出系統通知 "此環境變數太大,此對話方塊允許將值的長度設定成最多 2047 個字元。"。這一般最常會在系統的 Path 變數上, 隨著自行設定或者安裝新的應用程式、軟體,不斷地將各種不同的執行檔路徑或者程式庫路徑附加到 Path 變數上,很快地就會遇到這個情況。這時,要你一時之間去整理這些雜亂的超長變數內容,顯然是一個大麻煩。更不用說,即便摒棄掉各種不需要的路徑,或是縮短存放路徑 (透過 symbolic link 或者改變實體存放位置等等),還是超出了此 2047 字元的長度限制的狀況了。


作業系統: Windows 10 家用版 x64

本篇將以此版本的作業系統進行說明,相關設定可能會與其它版本有所差異 (e.g. 開啟位置、設定有效性、etc.)。

首先還是得來簡介一下遇到此問題的發生背景,以下是如何開啟系統環境變數的編輯視窗步驟:

1. 對 Windows 桌面左下角的 Windows 圖案,點擊滑鼠右鍵
2. 左鍵選擇 "設定",開啟 Windows 設定
3. 依序點擊 系統 > 關於 (更新的 Windows 10 版本會是系統資訊) > 相關設定 區塊下的 "進階系統設定"


1 / 2
Windows 進階系統設定

這裡會看到兩個區塊,分別為 "使用者變數" 以及 系統變數。由於我們是可以設定多個不同的使用者帳號去登入到 windows 桌面的,因此故名思義 "使用者變數" 會因為登入的使用者帳號不同而有差異;"系統變數" 則為不同使用者都可以共用的環境變數,大多數的應用程式如果沒有讓使用者選擇環境變數設定的位置,基本上會是改在 "系統變數" 上面。

對要修改的環境變數進行編輯 (滑鼠左鍵連點兩下 or 選取變數後,點擊 "編輯") 時,可能會出現以下兩種編輯視窗,一般是使用 ";" 切割為多行內容顯示的視窗,另一種則是單行的編輯視窗,不過有時候多行內容還是會用單行的視窗來顯示就是了 (可能是 bug 或者是某個特定條件決定)。

編輯系統變數 (多行顯示)

編輯系統變數 (單行顯示)

當我們對一個存有超長內容的變數進行修改並儲存時,就會遇到此現象。

我們可以用以下的步驟來開啟 "登錄編輯程式" 來修改並儲存 超出 2047 字元限制的環境變數:
1. Win + R 打開 "執行" 視窗,輸入 "regedit" 後,按下確定
2. 前往 "電腦\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" 即可看到系統環境變數清單

順帶一提,如果是要修改 "使用者變數" 的話,位置是在 "電腦\HKEY_USERS\<SID>\Environment"
可以跟在系統變數視窗的內容相互比較,找到你要設定的對象 (e.g. 在有建立多個使用者帳號的情況下)
P.S. SID 是指 安全性辨識碼 (Security identifiers),可用來代表你的使用者帳號。本機帳號的 SID 開頭一般是 "S-1-5" (SECURITY_NT_AUTHORITY),撇除掉系統固定、已知的 SID 後,你的使用者帳號可能是 "S-1-5-21"、"S-1-5-22" 開頭等等。
關於 SID 的更多資訊可以參考以下連結:

事實上,透過一些手段去繞過這樣的系統限制,是可能仍然會有使用上的問題的,比如應用程式或者命令提示字元在調用了某個特定函式或者讀取超出長度限制的環境變數時,是無法正常運作的。不見得是會讓程式出錯,可能是會產生不正確的結果出來。比如底下就有一些討論:
1. ShellExecuteEx fails for long arguments


2. ShellExecuteEx

3. What is the maximum length of an environment variable?

4. What is the command line length limit?

5. A returned path environment variable is truncated to 1,024 bytes on a Windows Server 2003-based or Windows XP-based computer

本篇提供了在 Windows 編輯環境變數,遇到了超出 2047 字元長度限制而無法儲存的解決方案以及相關的概念說明,並拋出了其他額外的延伸注意事項。旨在希望讀者在操作前、後,能明知後果以及影響範圍,避免遇到了更多的問題而摸不著頭緒。