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
。
- Windows では、ユーザー固有の CurrentUser スコープの場所は
さらに、Program Files ディレクトリなどの他のディレクトリにモジュールをインストールするプログラムをセットアップすると、その場所を の $env:PSModulePath
値に追加できます。
注意
Windows では、ユーザー固有の場所は PowerShell\Modules
、ユーザー プロファイルの [ドキュメント] フォルダーにあるフォルダーです。 その場所の特定のパスは、Windows のバージョンと、フォルダー リダイレクトを使用しているかどうかによって異なります。 Microsoft OneDrive では、 ドキュメント フォルダーの場所を変更することもできます。 次のコマンドを使用して、Documents フォルダーの場所を確認できます。 [Environment]::GetFolderPath('MyDocuments')
PowerShell PSModulePath の構築
の $env:PSModulePath
値は、PowerShell が起動するたびに構築されます。
値は、PowerShell のバージョンと起動方法によって異なります。
Windows PowerShellスタートアップ
Windows PowerShellでは、起動時に 次のロジックを使用して をPSModulePath
構築します。
- 存在しない場合
PSModulePath
は、CurrentUser、AllUsers、およびモジュール パスを$PSHOME
組み合わせます - が存在する場合
PSModulePath
:- にモジュール パスが
$PSHOME
含まれている場合PSModulePath
:- 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
比較する- 同じ場合:
- 環境変数のセマンティクスに従って、 AllUsers
PSModulePath
を末尾にPath
追加します - Windows
System32
パスは、定義PSModulePath
されたマシンから取得されるため、明示的に追加する必要はありません
- 環境変数のセマンティクスに従って、 AllUsers
- 異なる場合は、ユーザーが明示的に変更したかのように扱い、AllUsers を追加しないでください
PSModulePath
- 同じ場合:
- PS7 ユーザー、システム、パス
$PSHOME
をその順序でプレフィックスとして付けます- ユーザー スコープ
PSModulePath
の が含まれている場合powershell.config.json
は、ユーザーの既定値ではなく、これを使用します - システム スコープ
PSModulePath
の が含まれている場合powershell.config.json
は、システムの既定値ではなく、これを使用します
- ユーザー スコープ
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 は 、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"
コマンドのセミコロン (;
) は、新しいパスをリスト内のパスの前にあるパスから分離します。 Windows 以外のプラットフォームでは、コロン (:
) によって環境変数内のパスの場所が区切られます。
Windows 以外での PSModulePath の変更
Windows 以外の環境のすべてのセッションの の PSModulePath
値を変更するには、前のコマンドを PowerShell プロファイルに追加します。
Windows での PSModulePath の変更
Windows 環境のすべてのセッションの の 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 += ';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)