共用方式為


關於環境變數

簡短描述

描述如何在PowerShell中存取 Windows 環境變數。

詳細描述

環境變數會儲存作業系統環境的相關信息。 此資訊包括作業系統路徑、操作系統所使用的處理器數目,以及暫存資料夾的位置等詳細數據。

環境變數會儲存作業系統和其他程式所使用的數據。 例如, WINDIR 環境變數包含 Windows 安裝目錄的位置。 程式可以查詢此變數的值,以判斷 Windows 作業系統檔案的所在位置。

PowerShell 可以在任何支援的操作系統平臺中存取和管理環境變數。 PowerShell 環境提供者可讓您輕鬆地檢視和變更環境變數,藉此簡化此程式。

不同於 PowerShell 中其他類型的變數,環境變數會由子進程繼承,例如本機背景作業,以及模組成員執行所在的會話。 這讓環境變數非常適合用來儲存父進程和子進程所需的值。

使用和變更環境變數

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

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

進程範圍包含目前進程或 PowerShell 工作階段中可用的環境變數。 此變數清單繼承自父進程,並從 計算機用戶 範圍中的變數建構。 Unix 平臺只有 進程 範圍。

您可以使用變數語法搭配環境提供者,來顯示和變更環境變數的值,而不使用 Cmdlet。 若要顯示環境變數的值,請使用下列語法:

$Env:<variable-name>

例如,若要顯示環境變數的值 WINDIR ,請在PowerShell命令提示字元中輸入下列命令:

$Env:windir

在此語法中,貨幣符號 ($) 表示變數,而磁碟驅動器名稱 (Env:) 表示環境變數,後面接著變數名稱 (windir) 。

當您在 PowerShell 中變更環境變數時,變更只會影響目前的會話。 此行為類似於 Windows 命令殼層中命令的行為 SetSetenv 以及 UNIX 環境中命令的行為。 若要變更 Machine 或 User 範圍中的值,您必須使用 System.Environment 類別的方法。

若要變更計算機範圍的變數,也必須具有許可權。 如果您嘗試在沒有足夠許可權的情況下變更值,命令會失敗,且 PowerShell 會顯示錯誤。

您可以使用下列語法來變更變數的值,而不使用 Cmdlet:

$Env:<variable-name> = "<new-value>"

例如,若要附加 ;c:\temp 至環境變數的值 Path ,請使用下列語法:

$Env:Path += ";c:\temp"

在Linux或MacOS上,命令中的冒號 (:) 會將新路徑與清單中的路徑分隔開來。

$Env:PATH += ":/usr/local/temp"

您也可以使用專案 Cmdlet,例如 Set-ItemRemove-ItemCopy-Item 來變更環境變數的值。 例如,若要使用 Set-Item Cmdlet 附加 ;c:\temp 至環境變數的值 Path ,請使用下列語法:

Set-Item -Path Env:Path -Value ($Env:Path + ";C:\Temp")

在此命令中,值會以括弧括住,以便將它解譯為單位。

儲存喜好設定的環境變數

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 }
    
  • 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

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

    如需詳細資訊,請參閱 about_PSModulePath

管理環境變數

PowerShell 提供數種不同的方法來管理環境變數。

  • 環境提供者磁碟驅動器
  • Item Cmdlet
  • .NET System.Environment 類別
  • 在 Windows 上,系統 控制台

使用環境提供者

每個環境變數都是以 System.Collections.DictionaryEntry 類別的實例來表示。 在每個 DictionaryEntry 物件中,環境變數的名稱是字典索引鍵。 變數的值是字典值。

若要顯示代表PowerShell中環境變數的物件屬性和方法,請使用 Get-Member Cmdlet。 例如,若要顯示磁碟驅動器中 Env: 所有物件的方法和屬性,請輸入:

Get-Item -Path Env:* | Get-Member

PowerShell 環境提供者可讓您存取 PowerShell 磁碟驅動器中的環境變數, (Env: 磁碟驅動器) 。 此磁碟驅動器看起來像檔案系統磁碟驅動器。 若要移至 Env: 磁碟驅動器,請輸入:

Set-Location Env:

使用 Content Cmdlet 來取得或設定環境變數的值。

PS Env:\> Set-Content -Path Test -Value 'Test value'
PS Env:\> Get-Content -Path Test
Test value

您可以從任何其他 PowerShell 磁碟驅動器檢視磁碟驅動器中的 Env: 環境變數,並進入 Env: 磁碟驅動器以檢視和變更環境變數。

使用 Item Cmdlet

當您參考環境變數時,請輸入 Env: 磁碟驅動器名稱,後面接著變數的名稱。 例如,若要顯示環境變數的值 COMPUTERNAME ,請輸入:

Get-ChildItem Env:Computername

若要顯示所有環境變數的值,請輸入:

Get-ChildItem Env:

因為環境變數沒有子專案,所以和 Get-ChildItemGet-Item輸出相同。

根據預設,PowerShell 會依擷取環境變數的順序來顯示環境變數。 若要依變數名稱排序環境變數清單,請使用管線將命令的 Get-ChildItem 輸出傳送至 Sort-Object Cmdlet。 例如,從任何 PowerShell 磁碟驅動器輸入:

Get-ChildItem Env: | Sort Name

您也可以使用 Set-Location Cmdlet 進入Env:磁碟驅動器:

Set-Location Env:

當您在磁碟驅動器中 Env: 時,可以從路徑中省略 Env: 磁碟驅動器名稱。 例如,若要顯示所有環境變數,請輸入:

PS Env:\> Get-ChildItem

若要從磁碟驅動器內Env:顯示變數的值COMPUTERNAME,請輸入:

PS Env:\> Get-ChildItem ComputerName

將變更儲存至環境變數

若要持續變更 Windows 上的環境變數,請使用系統 控制台。 選取 [ 進階系統設定]。 在 [ 進階] 索引標籤上,按兩下 [ 環境變數...]。您可以在 使用者系統 (電腦) 範圍中新增或編輯現有的環境變數。 Windows 會將這些值寫入登錄,以便在工作階段和系統重新啟動之間保存。

或者,您可以在 PowerShell 配置檔中新增或變更環境變數。 此方法適用於任何支持平臺上的任何 PowerShell 版本。

使用 System.Environment 方法

System.Environment 類別提供 GetEnvironmentVariableSetEnvironmentVariable 方法,可讓您指定變數的範圍。

下列範例會使用 GetEnvironmentVariable 方法來取得 的 PSModulePath 機器設定和 SetEnvironmentVariable 方法,以將路徑新增 C:\Program Files\Fabrikam\Modules 至值。

$path = [Environment]::GetEnvironmentVariable('PSModulePath', 'Machine')
$newpath = $path + ';C:\Program Files\Fabrikam\Modules'
[Environment]::SetEnvironmentVariable("PSModulePath", $newpath, 'Machine')

如需 System.Environment 類別方法的詳細資訊,請參閱 環境方法

另請參閱