about_PSModulePath

環境変数 $env:PSModulePath には、モジュールとリソースを検索するために検索されるフォルダーの場所の一覧が含まれています。 PowerShell は、各フォルダーでモジュール ( または ) ファイルを再帰的.psd1.psm1検索します。

既定では、 に割り当てられる有効な場所は次 $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

注意

このWindows、ユーザー固有のPowerShell\Modules場所は、ユーザー プロファイルの Documents フォルダーにあるフォルダーです。 その場所の特定のパスは、Windowsのバージョンと、フォルダー リダイレクトを使用するかどうかによって異なります。 Microsoft OneDrive Documents フォルダーの場所を変更することもできます。 次のコマンドを使用して 、Documents フォルダーの場所を確認できます。 [Environment]::GetFolderPath('MyDocuments')

PowerShell PSModulePath の構築

の値は $env:PSModulePath 、PowerShell が開始されるごとに構築されます。 値は、PowerShell のバージョンと起動方法によって異なります。

Windows PowerShellスタートアップ

Windows PowerShell次のロジックを使用して、起動時に をPSModulePath構築します。

  • PSModulePath存在しない場合は、**CurrentUser、**AllUsers、およびモジュールのパスを$PSHOME結合します
  • PSModulePath 存在する場合:
    • にモジュール PSModulePath パスが含 $PSHOME まれている場合:
      • AllUsers モジュール のパスは、モジュール パスの前に $PSHOME 挿入されます
    • 他:
      • ユーザーが意図的 PSModulePath に場所を削除した後、定義されているを使用 $PSHOME するだけ

CurrentUser モジュール のパスは、ユーザー スコープが存在しない場合にのみ$env:PSModulePathプレフィックス付けされます。 それ以外の場合は、ユーザー スコープが $env:PSModulePath 定義された方法で使用されます。

PowerShell 7 の起動

たとえばWindowsほとんどの環境変数で、ユーザー スコープ変数が存在する場合、新しいプロセスでは、同じ名前のマシン スコープ変数が存在する場合にのみ、その値が使用されます。

PowerShell 7 では、 PSModulePath は、 で環境変数をPath処理する方法と同様にWindows。 このWindows、 Path は他の環境変数とは異なる方法で処理されます。 プロセスが開始すると、Windowsスコープとマシン Path スコープの が結合されますPath

  • ユーザー スコープを取得する PSModulePath
  • 継承された環境変数を処理と PSModulePath 比較する
    • 同じ場合:
      • 環境変数の セマンティクスの後に AllUsers PSModulePath を末尾に Path 追加します
      • このWindowsSystem32は、定義されたマシンから得PSModulePathたものなので、明示的に追加する必要はないので、
    • 異なる場合は、ユーザーが明示的に変更した場合と同様に扱い、 AllUsers を追加しない PSModulePath
  • PS7 ユーザー、システム、およびパス $PSHOME をその順序でプレフィックスとして付く
    • powershell.config.json ユーザー スコープが含まれている場合 PSModulePathは、ユーザーの既定値ではなく、 を使用します。
    • powershell.config.json システム スコープが含まれている場合 PSModulePathは、システムの既定値ではなく、 を使用します。

Unix システムでは、User 環境変数と System 環境変数は分離されています。 PSModulePath が継承され、PS7 固有のパスにプレフィックスが付く (まだ定義されていない場合)。

PowerShell 7 Windows PowerShellの開始

この説明では、 と のWindows PowerShell を意味powershell.exeしますpowershell_ise.exe

の値は $env:PSModulePath 、次の変更を加え WinPSModulePath 、 にコピーされます。

  • PS7 のユーザー モジュール パスを削除する
  • PS7 のシステム モジュール パスを削除する
  • モジュール パス PS7 を $PSHOME 削除する

PS7 のパスは削除され、PS7 モジュールが読み込まれWindows PowerShell。 値WinPSModulePathは、値の開始Windows PowerShell。

PowerShell 7 のWindows PowerShell

PowerShell 7 のスタートアップは、追加された継承パスを追加して、Windows PowerShell続きます。 PS7 固有のパスにはプレフィックスが付くので、機能上の問題はありません。

モジュール検索の動作

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 はモジュールの最高バージョン番号を読み込む。 特定のバージョンを読み込むには、 Import-Module を FullyQualifiedName パラメーターと一緒に使用 します。 詳細については、「Import-Module」を参照してください。

PSModulePath の変更

ほとんどの場合、モジュールは既定のモジュールの場所にインストールする必要があります。 ただし、環境変数の値を変更する必要がある場合 PSModulePath があります。

たとえば、現在のセッションの にディレクトリ C:\Program Files\Fabrikam\Modules を一時的 $env:PSModulePath に追加するには、次のコマンドを入力します。

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

コマンドのセミコロン (;) は、リスト内のパスの前にあるパスから新しいパスを区切ります。 非構成プラットフォームWindows、コロン (:) によって環境変数内のパスの場所が分離されます。

非インスタンスでの PSModulePath のWindows

非接続環境内のすべてのPSModulePathセッションの値を変更するにはWindows前のコマンドを PowerShell プロファイルに追加します。

の PSModulePath のWindows

環境内のすべてのセッションPSModulePathの 値を変更するには、Windows格納されているレジストリ キーを編集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 += ';C:\Program Files\Fabrikam\Modules' # or '%ProgramFiles%\Fabrikam\Modules'
$key.SetValue('PSModulePath',$path,[Microsoft.Win32.RegistryValueKind]::ExpandString)

ユーザー設定にパスを追加するには、レジストリ プロバイダーを から に変更 HKLM:\ します HKCU:\

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

関連項目