要在 Windows PATH 環境變數增加程式路徑,不想滑滑鼠,打算用下指令搞定,爬文查到 SETX PATH "%PATH%;C:\Tools\some-tool\bin" 的精簡寫法,大喜! 不料卻踩到地雷。

由於不想動用管理者權限,打算設在使用者 PATH 環境變數就好,原本長這樣:

設定時出現 WARNING: The data being saved is truncated to 1024 characters 警示,然後再跟我說,新值已經設定成功囉,花惹發!

修改後的 PATH 有兩個問題:1) 下方有些路徑遺失,最後一筆只到 App10,還被截掉一半 2) 前方多了系統 PATH 的內容。

其實 1024 字元的長度限制 SETX 文件有寫,以前看過有點印象,但沒被咬過就從沒放在心上:

Be aware there's a limit of 1024 characters when assigning contents to a variable using setx.
This means that the content is cropped if you go over 1024 characters, and that the cropped text is what's applied to the target variable. If this cropped text is applied to an existing variable, it can result in loss of data previously held by the target variable.

但我以為這種關鍵時刻,系統應該加上「長度超過 1024 將被截斷,你確定仍要寫入嗎?」之類的防呆,萬萬沒想到是資料都消失了才跟你報告壞消息,讓你後悔也來不及。

至於前方多出的路徑來自系統 PATH,因為 %PATH% 會同時含系統及使用者 PATH 內容,SETX 未加 /M 參數時是設定使用者環境變數,於是乎系統 PATH 便在使用者 PATH 重複出現。

坦白說,環境變數只有 PATH 及某些 LIB PATH 需要串接會有超長問題,大部分環境變數用 SETX 設定並不會有類似困擾。

好,那來研究透過指令串接 PATH 的正確姿勢吧!

PowerShell 有篇文件介紹環境變數操作,其中有個令人興奮的寫法:

$Env:PATH += ":/usr/local/temp"

但別高興太早,這個做法類似 DOS SET PATH=%PATH%;/usr/local/temp,只在當時工作階段有效,關閉命令視窗或重開機就沒了,要永久保存要乖乖使用 C# System.Environment.GetEnvironmentVariable()/SetEnvironmentVariable()。所以,為使用者 PATH 添加路徑的妥當寫法如下:(註:若是設定系統 PATH,請將 'user' 改成 'machine')

$orig = [System.Environment]::GetEnvironmentVariable('PATH', 'user')
$append = 'C:\Tools\some-tool\bin'
[System.Environment]::SetEnvironmentVariable('PATH',$orig+';'+$append, 'user')
# 或是寫成一行
[System.Environment]::SetEnvironmentVariable('PATH',[System.Environment]::GetEnvironmentVariable('PATH', 'user')+';C:\Tools\some-tool\bin', 'user')

這種雷只要踩過一次就會記住了,我還是覺得超長沒加防呆直接截斷是種「花惹發」等級的設計,既然 PowerShell 已成 Windows 系統管理的主流,就不用期待 DOS 工具改進修正,未來處理系統管理工作,還是忘了 DOS 直上 PowerShell 吧。


Comments

Be the first to post a comment

Post a comment