about_Environment_Variables
簡短描述
描述如何在PowerShell中存取和管理環境變數。
環境變數會儲存作業系統和其他程式所使用的數據。 PowerShell 會建立下列環境變數:
POWERSHELL_TELEMETRY_OPTOUT
POWERSHELL_DISTRIBUTION_CHANNEL
POWERSHELL_UPDATECHECK
PSExecutionPolicyPreference
PSModulePath
PSModuleAnalysisCachePath
PSDisableModuleAnalysisCacheCleanup
如需這些變數的完整描述,請參閱 本文的 PowerShell 環境變數 。
詳細描述
PowerShell 可以在任何支援的操作系統平臺中存取和管理環境變數。 PowerShell 環境提供者可讓您取得、新增、變更、清除及刪除目前控制台中的環境變數。
注意
不同於 Windows,macOS 和 Linux 上的環境變數名稱會區分大小寫。 例如, $env:Path
和 $env:PATH
是非 Windows 平臺上的不同環境變數。
環境變數與 PowerShell 中其他類型的變數不同,一律會儲存為字串。 與其他變數不同,子進程也會繼承這些變數,例如本機背景工作,以及模組成員執行所在的會話。 這讓環境變數非常適合儲存父進程和子進程所需的值。
在 Windows 上,環境變數可以在三個範圍中定義:
- 計算機 (或系統) 範圍
- 使用者範圍
- 程序範圍
[ 行程 ] 範圍包含目前進程或 PowerShell 工作階段中可用的環境變數。 此變數清單繼承自父進程,並從Machine和User範圍中的變數建構。
當您在 PowerShell 中變更環境變數時,變更只會影響目前的會話。 此行為類似於 Windows 命令殼層中命令的行為,以及 setenv
UNIX 環境中命令的行為set
。 若要變更 Machine 或 User 範圍中的值,您必須使用 System.Environment 類別的方法。
若要變更計算機範圍的變數,您也必須具有許可權。 如果您嘗試在沒有足夠許可權的情況下變更值,命令會失敗,且 PowerShell 會顯示錯誤。
PowerShell 提供數種不同的方法來使用和管理環境變數。
- 變數語法
- 環境提供者和專案 Cmdlet
- .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 中,環境變數無法設定為空字串。 將環境變數設定為 $null
,或將空字串從目前的會話中移除。 例如:
$Env:Foo = ''
$Env:Foo | Get-Member -MemberType Properties
Get-Member : You must specify an object for the Get-Member cmdlet.
At line:1 char:12
+ $env:foo | Get-Member
+ ~~~~~~~~~~
+ CategoryInfo : CloseError: (:) [Get-Member], InvalidOperationException
+ FullyQualifiedErrorId : NoObjectInGetMember,Microsoft.PowerShell.Commands.GetMemberCommand
Get-Member
傳回錯誤,因為已移除環境變數。
您可以在空字串上使用錯誤時,看到它不會傳回錯誤:
'' | Get-Member -MemberType Properties
TypeName: System.String
Name MemberType Definition
---- ---------- ----------
Length Property int Length {get;}
如需 PowerShell 中變數的詳細資訊,請參閱 about_Variables。
使用環境提供者和專案 Cmdlet
PowerShell 的環境 提供者提供介面,讓您以類似文件系統磁碟驅動器的格式與環境變數互動。 它可讓您在 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:
如需使用 環境 提供者管理環境變數的詳細資訊,請參閱 about_Environment_Provider。
使用 System.Environment 方法
System.Environment 類別提供 GetEnvironmentVariable()
和 SetEnvironmentVariable()
方法來取得和修改環境變數。
下列範例會建立新的環境變數 , Foo
其值為 Bar
,然後傳回其值。
[Environment]::SetEnvironmentVariable('Foo','Bar')
[Environment]::GetEnvironmentVariable('Foo')
Bar
您可以使用 方法移除環境變數 SetEnvironmentVariable()
,方法是指定變數值的空字串。 例如,若要移除 Foo
環境變數:
[Environment]::SetEnvironmentVariable('Foo','')
[Environment]::GetEnvironmentVariable('Foo')
如需 System.Environment 類別之方法的詳細資訊,請參閱環境方法。
在 Windows 中建立持續性環境變數
在 Windows 上,有三種方法可以持續變更環境變數:
- 在您的配置檔中設定它們
SetEnvironmentVariable()
使用方法- 使用系統 控制台
在配置檔中設定環境變數
您可以在載入設定檔的任何工作階段中使用您在 PowerShell 設定檔中新增或變更的任何環境變數。 此方法適用於任何支持平臺上的任何 PowerShell 版本。
例如,若要建立 CompanyUri
環境變數並更新 Path
環境變數以包含 C:\Tools
資料夾,請將下列幾行新增至 PowerShell 配置檔:
$Env:CompanyUri = 'https://internal.contoso.com'
$Env:Path += ';C:\Tools'
注意
在 Linux 或 macOS 上,會使用冒號 (:
) 而不是分號(;
) 來分隔清單中前面路徑的新路徑。
您可以使用自動變數取得 PowerShell 設定檔 $PROFILE
的路徑。 如需配置檔的詳細資訊,請參閱 about_Profiles。
使用 SetEnvironmentVariable 設定環境變數()
在 Windows 上,您可以將 方法的範圍 SetEnvironmentVariable()
指定為第三個參數,以在該範圍中設定環境變數。 計算機和用戶範圍都會保存在目前進程之外,讓您儲存新的或變更的環境變數。
例如,若要將具有 值Bar
的新環境變數Foo
儲存至計算機範圍:
[Environment]::SetEnvironmentVariable('Foo', 'Bar', 'Machine')
您可以將變數的值設定為空字串,以從使用者或計算機範圍刪除環境變數。
[Environment]::SetEnvironmentVariable('Foo', '', 'Machine')
在系統 控制台 中設定環境變數
在 [系統 控制台] 中,您可以在 [使用者] 和 [系統] 範圍中新增或編輯現有的環境變數。 Windows 會將這些值寫入登錄,以便在工作階段和系統重新啟動之間保存。
若要使用系統 控制台 對 Windows 上的環境變數進行持續性變更:
- 開啟系統 控制台。
- 選取系統。
- 選取 [ 進階系統設定]。
- 移至 [ 進階 ] 索引標籤。
- 選取 [ 環境變數...]。
- 執行您的變更。
在非 Windows 平臺上建立持續性環境變數
Linux 和 macOS 有作業系統在啟動應用程式之前用來設定環境變數的組態檔和腳本。
當以預設的 (login) 殼層執行 PowerShell 時,您可以在作業系統支援的全域初始化檔案中定義環境變數。 例如,在 Linux 上,您可以將環境變數新增至 /etc/environment
檔案,或建立腳本來設定環境變數,並將它 /etc/profile.d
放在資料夾中。 在macOS上,您可以將環境變數新增至 /etc/profile
檔案。
從另一個殼層啟動 PowerShell 時,您可以在非登入殼層所使用的殼層特定初始化檔案中定義環境變數,例如 ~/.bashrc
for 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 程式之前,必須先設定環境變數的非預設值。 如需有關建立永續性環境變數的資訊,請參閱前幾節。
PSExecutionPolicyPreference
儲存目前會話的執行原則集。 只有在您為單一會話設定執行原則時,才會存在此環境變數。 您可以透過兩種不同的方式來執行此動作。
使用 ExecutionPolicy 參數從命令行啟動工作階段,以設定工作階段的執行原則。
使用
Set-ExecutionPolicy
指令程式。 使用 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。
PSModuleAnalysisCachePath
PowerShell 可控制用來快取模組及其 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
延伸名作為可執行檔,您必須使用ftype
CMD 命令殼層的 和assoc
命令來註冊擴展名。 PowerShell 沒有直接方法來註冊檔案處理程式。 如需詳細資訊,請參閱 ftype 命令的檔。PowerShell 腳本一律會在目前的控制台會話中啟動。 您不需要新增
.PS1
擴充功能。XDG
變數在非 Windows 平臺上,PowerShell 會使用 XDG 基底目錄規格所定義的下列 XDG 環境變數。
XDG_CONFIG_HOME
XDG_DATA_HOME
XDG_CACHE_HOME
終端機功能
從 PowerShell 7.2 開始,下列環境變數可用來控制虛擬終端機功能,例如將輸出著色的 ANSI 逸出序列。 您可以使用 TERM
或 NO_COLOR
環境變數來關閉 ANSI 逸出序列的支援。
TERM
下列值
$env:TERM
會變更行為,如下所示:dumb
-集$Host.UI.SupportsVirtualTerminal = $false
xterm-mono
-集$PSStyle.OutputRendering = PlainText
xtermm
-集$PSStyle.OutputRendering = PlainText
NO_COLOR
如果
$env:NO_COLOR
存在,則會$PSStyle.OutputRendering
設定為PlainText
。 如需環境變數的詳細資訊NO_COLOR
,請參閱 https://no-color.org/。