共用方式為


about_PSModulePath

簡短描述

本文說明環境變數的 $env:PSModulePath 用途和使用方式。

詳細描述

$env:PSModulePath環境變數包含搜尋以尋找模組和資源的資料夾位置清單。 PowerShell 會以遞歸方式搜尋每個資料夾的模組 (.psd1.psm1) 檔案。

Install-Module具有 Scope 參數,可讓您指定模組是針對目前使用者還是所有使用者安裝。 如需詳細資訊,請參閱 Install-Module

根據預設,指派給 $env:PSModulePath 的有效位置如下:

  • 全系統位置:這些資料夾包含隨附於PowerShell的模組。 這些模組會儲存在 $PSHOME\Modules 資料夾中。 這也是安裝 Windows 管理模組的位置。

    安裝在 AllUsers 範圍中的模組會儲存在 中$env:ProgramFiles\WindowsPowerShell\Modules

  • 使用者安裝的模組:這些模組是安裝在 CurrentUser 範圍中的模組。 CurrentUser 範圍的位置通常是$HOME\Documents\WindowsPowerShell\Modules資料夾。 資料夾的特定位置 Documents 會因 Windows 版本和使用資料夾重新導向而有所不同。 此外,Microsoft OneDrive 也可以變更資料夾 Documents 的位置。 您可以使用下列命令來驗證資料夾的位置 Documents[Environment]::GetFolderPath('MyDocuments')

  • 應用程式特定模組:安裝程式可以在其他目錄中安裝模組,例如 Program Files 目錄。 安裝程式可能會將應用程式位置附加至的值 $env:PSModulePath

PowerShell PSModulePath 建構

每次 PowerShell 啟動時,都會建構 的值 $env:PSModulePath 。 此值會因 PowerShell 版本及其啟動方式而有所不同。

Windows PowerShell 啟動

Windows PowerShell 會使用下列邏輯在啟動時建構 PSModulePath

  • 如果 PSModulePath 不存在,請結合 CurrentUserAllUsers$PSHOME 模塊路徑
  • 如果 PSModulePath 存在:
    • 如果 PSModulePath 包含 $PSHOME 模組路徑:
      • AllUsers 模組路徑會在模組路徑之前 $PSHOME 插入
    • 還:
      • 只要依定義使用 PSModulePath ,因為使用者刻意移除 $PSHOME 位置

只有當用戶範圍$env:PSModulePath不存在時,CurrentUser 模組路徑才會加上前置詞。 否則,會如定義使用用戶範圍 $env:PSModulePath

模組搜尋行為

PowerShell 會以遞歸方式搜尋 PSModulePath 中的每個資料夾,以取得模組 (.psd1.psm1) 檔案。 此搜尋模式可讓相同模組的多個版本安裝在不同的資料夾中。 例如:

    Directory: C:\Program Files\WindowsPowerShell\Modules\PowerShellGet

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d----           8/14/2020  5:56 PM                1.0.0.1
d----           9/13/2019  3:53 PM                2.1.2

根據預設,PowerShell 會在找到多個版本時載入模組的最高版本號碼。 若要載入特定版本,請搭配 FullyQualifiedName 參數使用。Import-Module 如需詳細資訊,請參閱 Import-Module

修改 PSModulePath

在大部分情況下,您應該在預設模組位置安裝模組。 不過,您可能需要變更環境變數的值 PSModulePath

例如,若要暫時將目錄新增 C:\Program Files\Fabrikam\Modules$env:PSModulePath 目前的會話,請輸入:

$Env:PSModulePath = $Env:PSModulePath+";C:\Program Files\Fabrikam\Modules"

若要變更每個會話中的 值 PSModulePath ,請編輯儲存 PSModulePath 值的登錄機碼。 這些PSModulePath值會以未展開的字串的形式儲存在登錄中。 若要避免將值永久儲存 PSModulePath展開 的字串,請在 子機碼上使用 GetValue 方法,並直接編輯值。

下列範例會將 C:\Program Files\Fabrikam\Modules 路徑新增至環境變數的值 PSModulePath ,而不展開未展開的字串。

$key = (Get-Item 'HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager').OpenSubKey('Environment', $true)
$path = $key.GetValue('PSModulePath','','DoNotExpandEnvironmentNames')
$path += ';%ProgramFiles%\Fabrikam\Modules'
$key.SetValue('PSModulePath',$path,[Microsoft.Win32.RegistryValueKind]::ExpandString)

若要將路徑新增至使用者設定,請將登錄提供者從 HKLM:\ 變更為 HKCU:\

$key = (Get-Item 'HKCU:\').OpenSubKey('Environment', $true)
$path = $key.GetValue('PSModulePath','','DoNotExpandEnvironmentNames')
$path += ';%ProgramFiles%\Fabrikam\Modules'
$key.SetValue('PSModulePath',$path,[Microsoft.Win32.RegistryValueKind]::ExpandString)

另請參閱