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
に格納されます。 - Windows 以外のシステムでは、 AllUsers スコープにインストールされているモジュールは
/usr/local/share/powershell/Modules
に格納されます。
- Windows では、 AllUsers スコープにインストールされたモジュールが
ユーザーがインストールしたモジュール: Windows では、 CurrentUser スコープにインストールされたモジュールは、通常、
$HOME\Documents\WindowsPowerShell\Modules
フォルダーに格納されます。Documents
フォルダーの特定の場所は、Windows のバージョンとフォルダー リダイレクトを使用する場合によって異なります。 また、Microsoft OneDrive では、Documents
フォルダーの場所を変更できます。Documents
フォルダーの場所は、次のコマンドを使用して確認できます:[Environment]::GetFolderPath('MyDocuments')
。Windows 以外のシステムでは、 CurrentUser スコープにインストールされているモジュールは、
$HOME/.local/share/powershell/Modules
フォルダーに格納されます。アプリケーション固有のモジュール: セットアップ プログラムは、Windows の
Program Files
フォルダーなど、他のディレクトリにモジュールをインストールできます。 インストーラー パッケージは、場所を$env:PSModulePath
に追加する場合と追加しない場合があります。
PowerShell PSModulePath の構築
$env:PSModulePath
の値は、PowerShell が開始されるたびに構築されます。
この値は、PowerShell のバージョンと起動方法によって異なります。
Windows PowerShell の起動
Windows PowerShell では、起動時に次のロジックを使用して PSModulePath
を構築します。
PSModulePath
が存在しない場合は、CurrentUser、AllUsers、および$PSHOME
モジュール パスを結合しますPSModulePath
が存在する場合:PSModulePath
に$PSHOME
モジュールパスが含まれている場合:- allUsers モジュール パスは、モジュール パス
$PSHOME
前に挿入されます
- allUsers モジュール パスは、モジュール パス
- 然も無くば:
- ユーザーが意図的に
$PSHOME
の場所を削除したので、定義されているPSModulePath
を使用するだけです
- ユーザーが意図的に
CurrentUser モジュール パスには、ユーザー スコープ$env:PSModulePath
が存在しない場合にのみプレフィックスが付けられます。 それ以外の場合は、ユーザー スコープ $env:PSModulePath
が定義どおりに使用されます。
PowerShell 7 の起動
Windows では、ほとんどの環境変数で、ユーザー スコープ変数が存在する場合、同じ名前のマシン スコープ変数が存在する場合でも、新しいプロセスでその値が使用されます。
PowerShell 7 では、 PSModulePath
は Windows での Path
環境変数の処理方法と同様に扱われます。 Windows では、 Path
は他の環境変数とは異なる方法で扱われます。 プロセスが開始されると、Windows はユーザー スコープの Path
とマシン スコープの Path
を組み合わせます。
- ユーザー スコープを取得する
PSModulePath
- プロセス継承
PSModulePath
環境変数と比較する- 同じ場合:
Path
環境変数のセマンティクスに従って、AllUsersPSModulePath
を末尾に追加します- Windows
System32
パスは、PSModulePath
定義されているコンピューターから取得されるため、明示的に追加する必要はありません
- 異なる場合は、ユーザーが明示的に変更したかのように扱い、allUsers 追加しないでください
PSModulePath
- 同じ場合:
- PS7 ユーザー、システム、および
$PSHOME
パスのプレフィックスをその順序で指定するpowershell.config.json
にユーザー スコープのPSModulePath
が含まれている場合は、ユーザーの既定値ではなく、これを使用しますpowershell.config.json
にシステム スコープのPSModulePath
が含まれている場合は、システムの既定値ではなく、これを使用します。
Unix システムでは、ユーザー環境変数とシステム環境変数が分離されていません。
PSModulePath
は継承され、まだ定義されていない場合は PS7 固有のパスにプレフィックスが付けられます。
PowerShell 7 から Windows PowerShell を起動する
この説明では、 Windows PowerShell は powershell.exe
と powershell_ise.exe
の両方を意味します。
$env:PSModulePath
の値は、次の変更を加えてWinPSModulePath
にコピーされます。
- PS7 のユーザー モジュール パスを削除する
- PS7 のシステム モジュール パスを削除する
- PS7
$PSHOME
モジュール パスを削除する
PS7 モジュールが Windows PowerShell に読み込まれないように、PS7 パスが削除されます。 WinPSModulePath
値は、Windows PowerShell の起動時に使用されます。
Windows PowerShell から PowerShell 7 を起動する
PowerShell 7 の起動は、Windows PowerShell によって追加された継承パスが追加された状態でそのまま続行されます。 PS7 固有のパスにはプレフィックスが付いているため、機能上の問題はありません。
モジュールの検索動作
PowerShell は、モジュール (.psd1
または.psm1
) ファイルをPSModulePath 内の各フォルダーを再帰的に検索します。 この検索パターンにより、同じモジュールの複数のバージョンを異なるフォルダーにインストールできます。 次に例を示します。
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
環境変数の値を変更する必要がある場合があります。
たとえば、現在のセッションの$env:PSModulePath
にC:\Program Files\Fabrikam\Modules
ディレクトリを一時的に追加するには、次のように入力します。
$Env:PSModulePath = $Env:PSModulePath+";C:\Program Files\Fabrikam\Modules"
コマンドのセミコロン (;
) は、新しいパスをリストの前のパスから分離します。 Windows 以外のプラットフォームでは、コロン (:
) によって環境変数内のパスの場所が区切られます。
Windows 以外での PSModulePath の変更
Windows 以外の環境のすべてのセッションの PSModulePath
の値を変更するには、前のコマンドを PowerShell プロファイルに追加します。
Windows での PSModulePath の変更
すべてのセッションで PSModulePath
の値を変更するには、 PSModulePath
値を格納するレジストリ キーを編集します。 PSModulePath
値は、unexpanded 文字列としてレジストリに格納されます。 PSModulePath
値を expanded 文字列として永続的に保存しないようにするには、サブキーで GetValue メソッドを使用し、値を直接編集します。
次の例では、展開されていない文字列を展開せずに、PSModulePath
環境変数の値にC:\Program Files\Fabrikam\Modules
パスを追加します。
$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)
関連項目
PowerShell