about_Environment_Variables
簡短描述
描述如何在PowerShell中存取和管理環境變數。
完整描述
環境變數會儲存作業系統和其他程式所使用的數據。 例如, WINDIR
環境變數包含 Windows 安裝目錄的位置。 程式可以查詢此變數的值,以判斷 Windows 作業系統檔案所在的位置。
PowerShell 可以在任何支援的操作系統平臺中存取和管理環境變數。 PowerShell 環境提供者可讓您在目前的控制台中取得、新增、變更、清除和刪除環境變數。
環境變數不同於PowerShell中的其他變數類型,一律會儲存為字串,而且不能是空的。 與其他變數不同,子進程也會繼承這些變數,例如本機背景作業,以及模組成員執行所在的會話。 這讓環境變數非常適合用來儲存父進程和子進程所需的值。
在 Windows 上,環境變數可以在三個範圍中定義:
- 計算機 (或系統) 範圍
- 使用者範圍
- 進程範圍
進程範圍包含目前進程或 PowerShell 工作階段中可用的環境變數。 此變數清單繼承自父進程,並從 Machine 和 User 範圍中的變數建構。
當您在 PowerShell 中變更環境變數時,變更只會影響目前的會話。 此行為類似於 Windows 命令殼層中的命令行為 Set
,以及 Setenv
UNIX 型環境中的命令。 若要變更 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!
因為環境變數不能是空字串,所以將一個 設定為 $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".
如需使用 環境 提供者管理環境變數的詳細資訊,請參閱 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 上,有三種方法可持續變更環境變數:在配置檔中設定環境變數、使用 SetEnvironmentVariable 方法,以及使用 System 控制台。
在配置檔中儲存環境變數
您可以在載入設定檔的任何工作階段中使用您在 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 上的環境變數進行持續性變更:
- 開啟系統 控制台。
- 選取 [系統]。
- 選取 [進階系統設定]。
- 移至 [ 進階] 索引標籤。
- 選取 [環境變數...]。
- 進行變更。
PowerShell 的環境變數
PowerShell 功能可以使用環境變數來儲存使用者喜好設定。 這些變數的運作方式類似喜好設定變數,但這些變數是由建立這些變數之會話的子會話所繼承。 如需喜好設定變數的詳細資訊,請參閱 about_Preference_Variables。
儲存喜好設定的環境變數包括:
PSExecutionPolicyPreference
儲存目前會話的執行原則集。 只有在您為單一會話設定執行原則時,才會存在此環境變數。 您可以透過兩種不同的方式執行這項操作。
使用 ExecutionPolicy 參數從命令行啟動工作階段,以設定工作階段的執行原則。
使用
Set-ExecutionPolicy
指令程式。 使用 Scope 參數搭配 「Process」 值。如需詳細資訊,請參閱 about_Execution_Policies。
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 cannot 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
來關閉它們。設定此環境變數會在目前進程中立即生效。
PSModulePath
$env:PSModulePath
環境變數包含搜尋以尋找模組和資源的資料夾位置清單。根據預設,指派給
$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。
POWERSHELL_UPDATECHECK
更新通知行為可以使用
POWERSHELL_UPDATECHECK
環境變數來變更。 支援下列值:Off
關閉更新通知功能Default
與未定義POWERSHELL_UPDATECHECK
相同:- GA 版本會通知 GA 版本的更新
- 預覽/RC 版本會通知 GA 和預覽版本的更新
LTS
只會通知長期維護 (LTS) GA 版本的更新
如需詳細資訊,請參閱 about_Update_Notifications。
POWERSHELL_TELEMETRY_OPTOUT
若要選擇離開遙測,請將環境變數設定為
true
、yes
或1
。如需詳細資訊,請參閱 about_Telemetry。
PowerShell 所使用的其他環境變數
路徑資訊
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