簡短描述
描述如何在PowerShell中存取和管理環境變數。
完整描述
環境變數會儲存作業系統和其他程式所使用的數據。 PowerShell 會建立下列環境變數:
POWERSHELL_TELEMETRY_OPTOUTPOWERSHELL_DISTRIBUTION_CHANNELPOWERSHELL_UPDATECHECKPOWERSHELL_DIAGNOSTICS_OPTOUTPSExecutionPolicyPreferencePSModulePathPSModuleAnalysisCachePathPSDisableModuleAnalysisCacheCleanup
如需這些變數的完整描述,請參閱本文
PowerShell 可以在任何支援的操作系統平臺中存取和管理環境變數。 PowerShell 環境提供者可讓您在目前的控制台中取得、新增、變更、清除和刪除環境變數。
備註
不同於 Windows,macOS 和 Linux 上的環境變數名稱會區分大小寫。 例如,非 Windows 平臺上 $Env:Path 和 $Env:PATH 是不同的環境變數。
環境變數與 PowerShell 中其他類型的變數不同,一律會儲存為字串。 與其他變數不同,這些變數會被子進程繼承,例如本地後台工作,以及模組成員執行所在的會話。 這讓環境變數非常適合儲存父進程和子進程所需的值。
在 Windows 上,環境變數可以在三個範圍中定義:
- 計算機 (或系統) 範圍
- 用戶範圍
- 進程範圍
Process 範圍包含目前進程或 PowerShell 工作階段中可用的環境變數。 此變數清單繼承自父進程,並從 Machine 和 User 範圍中的變數建構。
當您在 PowerShell 中變更環境變數時,變更只會影響目前的會話。 此行為類似於 Windows 命令殼層中 set 命令的行為,以及 Unix 環境中 setenv 命令的行為。 若要變更 Machine 或 User 範圍中的值,您必須使用 System.Environment 類別的方法。
若要變更計算機範圍的變數,您也必須具有許可權。 如果您嘗試在沒有足夠許可權的情況下變更值,命令會失敗,且 PowerShell 會顯示錯誤。
PowerShell 提供數種不同的方法來使用和管理環境變數。
- 變數語法
- 環境提供者和項目命令
- .NET System.Environment 類別
使用變數語法
您可以使用下列語法來顯示和變更環境變數的值:
$Env:<variable-name>
例如,若要顯示 windir 環境變數的值:
$Env:windir
C:\Windows
在此語法中,貨幣符號($)表示變數,而磁碟驅動器名稱(Env:)則表示環境變數後面接著變數名稱(windir)。
您可以使用下列語法來建立及更新環境變數的值:
$Env:<variable-name> = "<new-value>"
例如,若要建立 Foo 環境變數:
$Env:Foo = 'An example'
因為環境變數一律是字串,因此您可以使用它們,就像包含字元串的任何其他變數一樣。 例如:
"The 'Foo' environment variable is set to: $Env:Foo"
$Env:Foo += '!'
$Env:Foo
The 'Foo' environment variable is set to: An example
An example!
從 PowerShell 7.5 開始,您可以將環境變數設定為空字串。 設定環境變數以 $null 將其從目前階段作業中移除。 例如:
PS> $env:TEST = ''
PS> Get-ChildItem env:TEST
Name Value
---- -----
TEST
PS> $env:TEST = $null
PS> $env:TEST.Length
0
PS> Get-ChildItem env:TEST
Get-ChildItem: Cannot find path 'TEST' because it does not exist.
如需 PowerShell 中變數的詳細資訊,請參閱 about_Variables。
使用環境提供者和項目 Cmdlet
PowerShell Environment 提供者提供介面,讓您能夠以類似文件系統磁碟驅動器的格式與環境變數互動。 它可讓您在 PowerShell 中取得、新增、變更、清除和刪除環境變數和值。
例如,若要建立具有 Foo值的 Bar 環境變數:
New-Item -Path Env:\Foo -Value 'Bar'
Name Value
---- -----
Foo Bar
您也可以使用 Copy-Item複製環境變數、使用 Set-Item設定環境變數的值、列出具有 Get-Item的環境變數,以及使用 Remove-Item刪除環境變數。
Copy-Item -Path Env:\Foo -Destination Env:\Foo2 -PassThru
Set-Item -Path Env:\Foo2 -Value 'BAR'
Get-Item -Path Env:\Foo*
Remove-Item -Path Env:\Foo* -Verbose
Name Value
---- -----
Foo2 Bar
Name Value
---- -----
Foo2 BAR
Foo Bar
VERBOSE: Performing the operation "Remove Item" on target "Item: Foo2".
VERBOSE: Performing the operation "Remove Item" on target "Item: Foo".
使用 Get-ChildItem Cmdlet 來檢視環境變數的完整清單:
Get-ChildItem Env:
從 PowerShell 7.5 開始,您可以使用環境提供者和 Set-Item Cmdlet 將環境變數設定為空字串。 設定環境變數以 $null 將其從目前階段作業中移除。 例如:
PS> Set-Item env:TEST 'Foo'
PS> Get-ChildItem env:TEST
Name Value
---- -----
TEST Foo
PS> Set-Item env:TEST ''
PS> Get-ChildItem env:TEST
Name Value
---- -----
TEST
PS> Set-Item -Path env:TEST -Value $null
PS> Get-ChildItem env:TEST
Get-ChildItem: Cannot find path 'TEST' because it does not exist.
如需使用 Environment 提供者來管理環境變數的詳細資訊,請參閱 about_Environment_Provider。
使用 System.Environment 方法
System.Environment 類別提供 GetEnvironmentVariable() 和 SetEnvironmentVariable() 方法來取得和修改環境變數。
下列範例會建立新的環境變數 Foo,其值為 Bar,然後傳回其值。
[Environment]::SetEnvironmentVariable('Foo','Bar')
[Environment]::GetEnvironmentVariable('Foo')
Bar
從 PowerShell 7.5 開始,您可以使用方法將 SetEnvironmentVariable() 環境變數設定為空字串,並指定空字串或 $null 變數的值。 例如:
PS> [Environment]::SetEnvironmentVariable('Foo','Bar')
PS> Get-ChildItem env:Foo
Name Value
---- -----
Foo Bar
PS> [Environment]::SetEnvironmentVariable('Foo','')
PS> Get-ChildItem env:Foo
Name Value
---- -----
Foo
PS> [Environment]::SetEnvironmentVariable('Foo','bar')
PS> Get-ChildItem env:Foo
Name Value
---- -----
Foo bar
PS> [Environment]::SetEnvironmentVariable('Foo',$null)
PS> Get-ChildItem env:Foo
Name Value
---- -----
Foo
備註
與變數語法和提供者案例不同,將值指派給 $null 使用 SetEnvironmentVariable() 方法並不會移除環境變數。
如需 System.Environment 類別之方法的詳細資訊,請參閱 Environment Methods。
在 Windows 中建立持續性環境變數
在 Windows 上,有三種方法可以持續變更環境變數:
- 在您的配置檔中設定它們
- 使用
SetEnvironmentVariable()方法 - 使用系統控制面板
在配置檔中設定環境變數
您可以在載入設定檔的任何工作階段中使用您在 PowerShell 設定檔中新增或變更的任何環境變數。 此方法適用於任何支持平臺上的任何 PowerShell 版本。
例如,若要建立 CompanyUri 環境變數,並更新 PATH 環境變數以包含 C:\Tools 資料夾,請將下列幾行新增至PowerShell配置檔:
$Env:CompanyUri = 'https://internal.contoso.com'
$Env:PATH += ';C:\Tools'
備註
在Linux或macOS上,會使用冒號(:),而不是分號(;),將新路徑與清單中的路徑分隔開來。
您可以使用 $PROFILE 自動變數,取得 PowerShell 配置檔的路徑。 如需設定檔的詳細資訊,請參閱 about_Profiles。
使用 SetEnvironmentVariable 設定環境變數()
在 Windows 上,您可以將 SetEnvironmentVariable() 方法的範圍指定為第三個參數,以在該範圍中設定環境變數。 計算機和用戶範圍都會保存在目前進程之外,讓您儲存新的或變更的環境變數。
例如,若要將新的環境變數儲存 Foo,並將值 Bar儲存至計算機範圍:
[Environment]::SetEnvironmentVariable('Foo', 'Bar', 'Machine')
您可以將變數的值設定為空字串,以從使用者或計算機範圍刪除環境變數。
[Environment]::SetEnvironmentVariable('Foo', '', 'Machine')
在系統控制面板中設定環境變數
在 [系統控制面板] 中,您可以在 使用者 和 系統 (Machine) 範圍中新增或編輯現有的環境變數。 Windows 會將這些值寫入登錄,以便在工作階段和系統重新啟動之間保存。
若要使用系統控制面板對 Windows 上的環境變數進行持續性變更:
- 開啟 [系統控制面板]。
- 選取 系統。
- 選取 [進階系統設定]。
- 前往 [進階] 頁籤。
- 選取 [環境變數...]。
- 請進行修改。
在非 Windows 平臺上建立持續性環境變數
Linux 和 macOS 有作業系統在啟動應用程式之前用來設定環境變數的組態檔和腳本。
當以預設的(登入)Shell 執行 PowerShell 時,您可以在作業系統支援的全域初始化檔案中定義環境變數。 例如,在 Linux 上,您可以將環境變數新增至 /etc/environment 檔案,或建立腳本來設定環境變數,並將它放在 /etc/profile.d 資料夾中。 在macOS上,您可以將環境變數新增至 /etc/profile 檔案。
從其他介面啟動 PowerShell 時,您可以在非登入環境所使用的介面特定初始化檔案中定義環境變數,例如 ~/.bashrc 用於 bash,或 ~/.zshrc 用於 zsh。
如需詳細資訊,請參閱您的操作系統及預設指令解析器的文件。
PowerShell 環境變數
PowerShell 功能可以使用環境變數來儲存使用者喜好設定。 這些變數的運作方式類似偏好變數,但它們會被創建這些變數的會話的子會話繼承。 如需喜好設定變數的詳細資訊,請參閱 about_Preference_Variables。
儲存喜好設定的環境變數包括:
POWERSHELL_TELEMETRY_OPTOUT若要選擇離開遙測,請將環境變數設定為
true、yes或1。 如需詳細資訊,請參閱 about_Telemetry。若要讓此環境變數生效,必須先設定它,才能啟動PowerShell程式。 如需有關建立永續性環境變數的資訊,請參閱前幾節。
POWERSHELL_DISTRIBUTION_CHANNEL從 PowerShell 7.2 開始,安裝程式套件會設定此環境變數,以記錄 PowerShell 安裝的方法和來源。
此資訊包含在傳送至Microsoft的遙測數據中。 用戶不應該變更此值。
POWERSHELL_UPDATECHECK您可以使用
POWERSHELL_UPDATECHECK環境變數來變更更新通知行為。 如需詳細資訊,請參閱 about_Update_Notifications。支援下列值:
-
Off關閉更新通知功能 -
Default與未定義POWERSHELL_UPDATECHECK相同:- GA 更新版本公告會通知有關 GA 更新的資訊
- 預覽/RC 版本會通知 GA 和預覽版本的更新
-
LTS只會通知長期維護 (LTS) GA 版本的更新
啟動 PowerShell 程式之前,必須先設定環境變數的非預設值。 如需有關建立永續性環境變數的資訊,請參閱前幾節。
-
POWERSHELL_DIAGNOSTICS_OPTOUT此環境變數已新增至 PowerShell 7.6-preview.5 中。 根據預設,PowerShell 會建立用於進程間通訊 (IPC) 的具名管道,例如
Enter-PSHostProcess。 PowerShell 會在啟動時建立具名管道,以便在需要時使用它。在非 Windows 平臺上,具名管道會實作為資料夾中的
/tmp檔案。 如果 PowerShell 崩潰,這些檔案可能無法刪除。 隨著時間的推移,這些文件可能會累積。從 PowerShell 7.6 開始,
POWERSHELL_DIAGNOSTICS_OPTOUT設定為false。 若要關閉具名管道的建立,請將環境變數設定為true、yes或1。PSExecutionPolicyPreference儲存目前會話的執行政策設定。 只有在您為單一會話設定執行原則時,才會存在此環境變數。 您可以透過兩種不同的方式來執行此動作。
使用 ExecutionPolicy 參數,從命令行啟動會話,以設定會話的執行原則。
使用
Set-ExecutionPolicyCmdlet。 使用 Scope 參數搭配Process值。手動設定環境變數。 變更此變數的值會變更目前進程的執行原則。
此資訊僅適用於 Windows 平臺。 如需詳細資訊,請參閱 about_Execution_Policies。
PSModulePath$Env:PSModulePath環境變數包含搜尋以尋找模組和資源的資料夾位置清單。 在 Windows 上,資料夾位置清單會以分號 (;) 字元分隔。 在非 Windows 平臺上,冒號 (:) 會分隔環境變數中的資料夾位置。根據預設,指派給
$Env:PSModulePath的有效位置如下:全系統位置:這些資料夾包含隨附於PowerShell的模組。 模組會儲存在
$PSHOME\Modules位置。 此外,這是安裝 Windows 管理模組的位置。使用者安裝的模組:這些模組是由使用者所安裝。
Install-Module具有 Scope 參數,可讓您指定模組是否已針對目前使用者或所有使用者安裝。 如需詳細資訊,請參閱 Install-Module。- 在 Windows 上,使用者特定 CurrentUser 範圍的位置是
$HOME\Documents\PowerShell\Modules資料夾。 AllUsers 範圍的位置$Env:ProgramFiles\PowerShell\Modules。 - 在非 Windows 系統上,使用者特定 CurrentUser 範圍的位置是
$HOME/.local/share/powershell/Modules資料夾。 AllUsers 範圍的位置/usr/local/share/powershell/Modules。
- 在 Windows 上,使用者特定 CurrentUser 範圍的位置是
此外,某些在其他目錄(如 Program Files 目錄)中安裝模組的安裝程式,可以將它們的位置附加到
$Env:PSModulePath的值中。如需詳細資訊,請參閱 about_PSModulePath。
PSModuleAnalysisCachePathPowerShell 可控制用來快取模組及其 Cmdlet 相關數據的檔案。 快取會在啟動時進行讀取,以搜尋命令,並在匯入模組後於背景執行緒上寫入。
快取的預設位置為:
- Windows PowerShell 5.1:
$Env:LOCALAPPDATA\Microsoft\Windows\PowerShell - PowerShell 6.0 和更新版本:
$Env:LOCALAPPDATA\Microsoft\PowerShell - 非 Windows 預設值:
~/.cache/powershell
快取的預設檔案名是
ModuleAnalysisCache。 當您安裝多個 PowerShell 實例時,檔名會包含十六進位後綴,讓每個安裝都有唯一的檔名。備註
如果命令探索無法正常運作,例如 IntelliSense 會顯示不存在的命令,您可以刪除快取檔案。 下次啟動 PowerShell 時,會重新建立快取。
若要變更快取的預設位置,請在啟動 PowerShell 之前設定環境變數。 此值應該會命名PowerShell有權建立和寫入檔案的完整路徑(包括檔名)。
此環境變數的變更只會影響子進程。 如需有關建立永續性環境變數的資訊,請參閱前幾節。
若要停用檔案快取,請將此值設定為無效的位置,例如:
# `NUL` here is a special device on Windows that can't be written to, # on non-Windows you would use `/dev/null` $Env:PSModuleAnalysisCachePath = 'NUL'這會設定 NUL 裝置的路徑。 PowerShell 無法寫入路徑,但不會傳回錯誤。 您可以使用追踪器查看報告的錯誤:
Trace-Command -PSHost -Name Modules -Expression { Import-Module Microsoft.PowerShell.Management -Force }- Windows PowerShell 5.1:
PSDisableModuleAnalysisCacheCleanup寫出模組分析快取時,PowerShell 會檢查已不存在的模組,以避免不必要的大型快取。 有時候不需要這些檢查,在此情況下,您可以將此環境變數值設定為
1來將其關閉。設定此環境變數會針對目前進程中的後續清除事件生效。 若要確保啟動時已停用清除,您必須在啟動 PowerShell 之前設定環境變數。 如需有關建立永續性環境變數的資訊,請參閱前幾節。
PowerShell 所使用的其他環境變數
路徑資訊
PATH$Env:PATH環境變數包含作業系統搜尋可執行檔的資料夾位置清單。 在 Windows 上,資料夾位置清單會以分號 (;) 字元分隔。 在非 Windows 平臺上,冒號 (:) 會分隔環境變數中的資料夾位置。PATHEXT$Env:PATHEXT變數包含 Windows 視為可執行檔的擴展名清單。 從 PowerShell 執行具有其中一個已列出延伸模組的腳本檔案時,腳本會在目前的控制台或終端機會話中執行。 如果未列出擴展名,腳本會在新的控制台會話中執行。若要確保其他文稿語言的腳本會在目前的控制台會話中執行,請新增腳本語言所使用的擴展名。 例如,若要在目前的控制台中執行 Python 腳本,請將
.py延伸模組新增至環境變數。 若要讓 Windows 支援.py擴展名作為可執行檔,您必須使用 CMD 命令殼層的ftype和assoc命令來註冊擴展名。 PowerShell 沒有直接方法來註冊檔案處理程式。 如需詳細資訊,請參閱 ftype 命令的檔。PowerShell 腳本一律會在目前的控制台會話中啟動。 您不需要新增
.ps1擴充功能。XDG變數在非 Windows 平臺上,PowerShell 會使用下列 XDG 環境變數,如 XDG 基底目錄規格所定義。
XDG_CONFIG_HOMEXDG_DATA_HOMEXDG_CACHE_HOME
終端機功能
從 PowerShell 7.2 開始,下列環境變數可用來控制虛擬終端機功能,例如將輸出著色的 ANSI 逸出序列。 您可以使用 TERM 或 NO_COLOR 環境變數來關閉 ANSI 逸出序列的支援。
TERM下列值
$Env:TERM會改變其行為,詳述如下:-
dumb- 設定$Host.UI.SupportsVirtualTerminal = $false -
xterm-mono- 設定$PSStyle.OutputRendering = PlainText -
xterm- 設定$PSStyle.OutputRendering = PlainText
-
NO_COLOR如果
$Env:NO_COLOR存在,則$PSStyle.OutputRendering會設定為PlainText。 如需NO_COLOR環境變數的詳細資訊,請參閱 https://no-color.org/。