簡體   English   中英

創建具有可擴展值的用戶環境變量

[英]Create user environment variable with expandable value

我可以輕松地在Powershell 腳本(Windows 10)中創建用戶環境變量

[System.Environment]::SetEnvironmentVariable('name', 'value', 'User')

當變量應該包含另一個用戶環境變量時,%OTHERVAR%;static_part ,我發現類型必須是ExpandString 這可以按如下方式完成

Set-ItemProperty HKCU:\Environment 'name' 'value' -Type ExpandString

所以,我寫了下面的代碼

[System.Environment]::SetEnvironmentVariable('M2_HOME', 'C:\dev\app\apache-maven-3.3.9', 'User')
# special treatment to get expandable type
Set-ItemProperty HKCU:\Environment 'PATH' '%M2_HOME%\bin;C:\Users\UID20852\AppData\Local\Microsoft\WindowsApps;' -Type ExpandString

Write-Host ([System.Environment]::GetEnvironmentVariable('M2_HOME', 'User'))
Write-Host ([System.Environment]::GetEnvironmentVariable('PATH', 'User'))
Write-Host 

輸出:

C:\dev\app\apache-maven-3.3.9
C:\dev\app\apache-maven-3.3.9\bin;C:\Users\UID20852\AppData\Local\Microsoft\WindowsApps;

一切看起來都很好,兩個變量都存在。 當我打開 Windows 控件編輯用戶環境變量時,我看到兩個變量和 PATH 的值被擴展。 即使在regedit我也看到變量的類型是正確的。

但是,當我打開一個新的cmd並嘗試從%M2_HOME%\\bin (現在應該在PATH )運行二進制文件時,它失敗了

要手動解決問題,我只需要打開 Windows 控件來編輯用戶環境變量,雙擊PATH變量,不編輯任何內容,然后再次關閉它(我猜它會重寫它)。

然后,在一個新的cmd ,我可以從%M2_HOME%\\bin運行二進制文件。

有什么想法可以讓這個PATH變量通過腳本工作嗎?

感謝@PetSerAl。 他的回答首先用占位符字符串作為PATH變量的前綴,然后創建滿足占位符的環境變量,然后完美地工作。

# special treatment to get expandable type
Set-ItemProperty HKCU:\Environment 'PATH' '%M2_HOME%\bin;C:\Users\UID20852\AppData\Local\Microsoft\WindowsApps;' -Type ExpandString
[System.Environment]::SetEnvironmentVariable('M2_HOME', 'C:\dev\app\apache-maven-3.3.9', 'User')

如果我理解他在評論中的解釋是正確的,因為“正常”變量的創建會觸發一個事件,該事件立即用占位符更新變量。 所以它在腳本完成后立即工作。

任何使用Environment.SetEnvironmentVariable() API 的程序,如 PowerShell,都會廣播WM_SETTINGCHANGE ,通知系統它需要重新加載環境。 然后任何新會話都可以訪問更新的環境。 僅當您使用Set-ItemProperty時不會觸發此操作。

我強烈建議使用免費工具Rapid Environment Editor 它的命令行涵蓋了​​有關環境變量管理的任何需求,其 GUI 將一目了然地顯示每個細節。

如果您想向現有變量添加新值,則測試其命令行以不使用-S參數時要小心,因為它會覆蓋任何以前的值。 請改用 -I 或 -A。 並始終使用-C以避免重復和無效的值。 -E 參數允許使用可擴展變量。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM