共用方式為


about_Environment_Variables

簡短描述

描述如何在PowerShell中存取和管理環境變數。

環境變數會儲存作業系統和其他程式所使用的數據。 PowerShell 會建立下列環境變數:

  • PSExecutionPolicyPreference
  • PSModulePath
  • PSModuleAnalysisCachePath
  • PSDisableModuleAnalysisCacheCleanup

如需這些變數的完整描述,請參閱 本文的 PowerShell 環境變數

詳細描述

PowerShell 可以在任何支援的操作系統平臺中存取和管理環境變數。 PowerShell 環境提供者可讓您取得、新增、變更、清除及刪除目前控制台中的環境變數。

環境變數與 PowerShell 中其他類型的變數不同,一律會儲存為字串。 與其他變數不同,子進程也會繼承這些變數,例如本機背景工作,以及模組成員執行所在的會話。 這讓環境變數非常適合儲存父進程和子進程所需的值。

在 Windows 上,環境變數可以在三個範圍中定義:

  • 計算機 (或系統) 範圍
  • 使用者範圍
  • 程序範圍

[ 行程 ] 範圍包含目前進程或 PowerShell 工作階段中可用的環境變數。 此變數清單繼承自父進程,並從MachineUser範圍中的變數建構。

當您在 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'

您可以使用自動變數取得 PowerShell 設定檔 $PROFILE 的路徑。 如需配置檔的詳細資訊,請參閱 about_Profiles

使用 SetEnvironmentVariable 設定環境變數()

在 Windows 上,您可以將 方法的範圍 SetEnvironmentVariable() 指定為第三個參數,以在該範圍中設定環境變數。 計算機和用戶範圍都會保存在目前進程之外,讓您儲存新的或變更的環境變數。

例如,若要將具有 值Bar的新環境變數Foo儲存至計算機範圍:

[Environment]::SetEnvironmentVariable('Foo', 'Bar', 'Machine')

您可以將變數的值設定為空字串,以從使用者或計算機範圍刪除環境變數。

[Environment]::SetEnvironmentVariable('Foo', '', 'Machine')

在系統 控制台 中設定環境變數

在 [系統] 控制台 中,您可以在 [使用者] 和 [計算機] 範圍中新增或編輯現有的環境變數。 Windows 會將這些值寫入登錄,以便在工作階段和系統重新啟動之間保存。

若要使用系統 控制台 對 Windows 上的環境變數進行持續性變更:

  1. 開啟 [系統 控制台。
  2. 選取系統
  3. 選取 [ 進階系統設定]。
  4. 移至 [ 進階 ] 索引標籤。
  5. 選取 [ 環境變數...]。
  6. 執行您的變更。

PowerShell 環境變數

PowerShell 功能可以使用環境變數來儲存使用者喜好設定。 這些變數的運作方式類似喜好設定變數,但它們是由其建立所在的會話子會話所繼承。 如需喜好設定變數的詳細資訊,請參閱 about_Preference_Variables

儲存喜好設定的環境變數包括:

  • PSExecutionPolicyPreference

    儲存目前會話的執行原則集。 只有在您為單一會話設定執行原則時,才會存在此環境變數。 您可以透過兩種不同的方式來執行此動作。

    • 使用 ExecutionPolicy 參數從命令行啟動工作階段,以設定工作階段的執行原則。

    • 使用 Set-ExecutionPolicy 指令程式。 使用 Scope 參數搭配 的值 Process

    • 手動設定環境變數。 變更此變數的值會變更目前進程的執行原則。

    此資訊僅適用於 Windows 平臺。 如需詳細資訊,請參閱 about_Execution_Policies

  • 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

    此外,將模組安裝在其他目錄中的安裝程式,例如 Program Files 目錄,可以將其位置附加至 的值 $env:PSModulePath

    如需詳細資訊,請參閱 about_PSModulePath

  • PSModuleAnalysisCachePath

    PowerShell 可控制用來快取模組及其 Cmdlet 相關數據的檔案。 快取會在啟動時讀取,同時搜尋命令,並在匯入模組後於背景線程上寫入。

    快取的預設位置為:

    • $env:LOCALAPPDATA\Microsoft\Windows\PowerShell

    快取的預設檔案名稱為 ModuleAnalysisCache

    注意

    如果命令探索無法正常運作,例如 IntelliSense 會顯示不存在的命令,您可以刪除快取檔案。 下次啟動 PowerShell 時,會重新建立快取。

    若要變更快取的預設位置,請在啟動 PowerShell 之前設定環境變數。 此值應該會命名PowerShell有權建立和寫入檔案的完整路徑(包括檔名)。

    此環境變數的變更只會影響子進程。 如需有關建立永續性環境變數的資訊,請參閱前幾節。

    若要停用檔案快取,請將此值設定為無效的位置,例如:

    # `NUL` here is a special device on Windows that can't be written to
    $env:PSModuleAnalysisCachePath = 'NUL'
    

    這會設定 NUL 裝置的路徑。 PowerShell 無法寫入路徑,但不會傳回錯誤。 您可以使用追蹤來檢視回報的錯誤:

    Trace-Command -PSHost -Name Modules -Expression {
      Import-Module Microsoft.PowerShell.Management -Force
    }
    
  • PSDisableModuleAnalysisCacheCleanup

    寫出模組分析快取時,PowerShell 會檢查已不存在的模組,以避免不必要的大型快取。 有時候不需要這些檢查,在此情況下,您可以將此環境變數值設定為 1來關閉。

    設定此環境變數會針對目前進程中的後續清除事件生效。 若要確保啟動時已停用清除,您必須在啟動 PowerShell 之前設定環境變數。 如需有關建立永續性環境變數的資訊,請參閱前幾節。

PowerShell 所使用的其他環境變數

路徑資訊

  • PATH

    $env:PATH環境變數包含作業系統搜尋可執行檔的資料夾位置清單。 在 Windows 上,資料夾位置清單會以分號 (;) 字元分隔。

  • PATHEXT

    變數 $env:PATHEXT 包含 Windows 視為可執行檔的擴展名清單。 從 PowerShell 執行具有其中一個已列出延伸模組的腳本檔案時,腳本會在目前的控制台或終端機會話中執行。 如果未列出擴展名,腳本會在新的控制台會話中執行。

    若要確保其他文稿語言的腳本會在目前的控制台會話中執行,請新增腳本語言所使用的擴展名。 例如,若要在目前的控制台中執行 Python 腳本,請將擴充功能新增 .py 至環境變數。 若要讓 Windows 支援 .py 延伸名作為可執行檔,您必須使用 ftype CMD 命令殼層的 和 assoc 命令來註冊擴展名。 PowerShell 沒有直接方法來註冊檔案處理程式。 如需詳細資訊,請參閱 ftype 命令的檔

    PowerShell 腳本一律會在目前的控制台會話中啟動。 您不需要新增 .PS1 擴充功能。

另請參閱