次の方法で共有


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 では、 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が存在しない場合は、CurrentUserAllUsers、および $PSHOME モジュール パスを結合します
  • PSModulePathが存在する場合:
    • PSModulePath$PSHOMEモジュールパスが含まれている場合:
      • allUsers モジュール パスは、モジュール パス $PSHOME 前に挿入されます
    • 然も無くば:
      • ユーザーが意図的に$PSHOMEの場所を削除したので、定義されているPSModulePathを使用するだけです

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

PowerShell 7 の起動

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

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

  • ユーザー スコープを取得する PSModulePath
  • プロセス継承 PSModulePath 環境変数と比較する
    • 同じ場合:
      • Path環境変数のセマンティクスに従って、AllUsers PSModulePath を末尾に追加します
      • Windows System32 パスは、 PSModulePath 定義されているコンピューターから取得されるため、明示的に追加する必要はありません
    • 異なる場合は、ユーザーが明示的に変更したかのように扱い、allUsers 追加しないでください PSModulePath
  • PS7 ユーザー、システム、および $PSHOME パスのプレフィックスをその順序で指定する
    • powershell.config.jsonにユーザー スコープのPSModulePathが含まれている場合は、ユーザーの既定値ではなく、これを使用します
    • powershell.config.jsonにシステム スコープのPSModulePathが含まれている場合は、システムの既定値ではなく、これを使用します。

Unix システムでは、ユーザー環境変数とシステム環境変数が分離されていません。 PSModulePath は継承され、まだ定義されていない場合は PS7 固有のパスにプレフィックスが付けられます。

PowerShell 7 から Windows PowerShell を起動する

この説明では、 Windows PowerShellpowershell.exepowershell_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:PSModulePathC:\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)

関連項目