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