次の方法で共有


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 、ユーザー プロファイルの [ドキュメント] フォルダーにあるフォルダーです。 その場所の特定のパスは、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 挿入されます
    • 他:
      • ユーザーが意図的に場所を削除したので、定義どおりにを$PSHOME使用PSModulePathするだけです

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

PowerShell 7 の起動

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

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

  • ユーザー スコープを取得する PSModulePath
  • 継承された環境変数をプロセスと PSModulePath 比較する
    • 同じ場合:
      • 環境変数のセマンティクスに従って、 AllUsersPSModulePath を末尾に Path 追加します
      • Windows System32 パスは、定義 PSModulePath されたマシンから取得されるため、明示的に追加する必要はありません
    • 異なる場合は、ユーザーが明示的に変更したかのように扱い、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)

こちらもご覧ください