次の方法で共有


about_Modules

簡単な説明

PowerShell モジュールをインストール、インポート、および使用する方法について説明します。

詳細な説明

PowerShell は、コマンド シェルとスクリプト言語の両方です。 PowerShell のコマンドは、スクリプト、関数、またはコマンドレットとして実装されます。 この言語には keywordsが含まれており、処理の構造とロジック、およびその他のリソース (変数、プロバイダー、エイリアスなど) が提供されます。

モジュールは、コマンドレット、プロバイダー、関数、変数、およびその他のリソースを含めることができる自己完結型の再利用可能なユニットです。 既定では、モジュールからコマンドを初めて使用するときに、インストールされているモジュールが PowerShell によって自動的に読み込まれます。 変数 $PSModuleAutoloadingPreferenceを使用して、モジュールの自動読み込み動作を構成できます。 詳細については、「 about_Preference_Variables」を参照してください。

PowerShell セッション中にモジュールを手動で読み込んだりアンロードしたりすることもできます。 モジュールを読み込むまたは再読み込みするには、 Import-Moduleを使用します。 モジュールをアンロードするには、 Remove-Module コマンドレットを使用します。

PowerShell には、モジュールの基本セットが含まれています。 C# または PowerShell スクリプト言語自体を使用して、誰でも新しいモジュールを作成できます。 C# でコンパイル済みの .NET アセンブリとして記述されたモジュールは、ネイティブ モジュールと呼ばれます。 PowerShell で記述されたモジュールは、スクリプト モジュールと呼ばれます。

この記事では、PowerShell モジュールの使用方法について説明します。 PowerShell モジュールを作成する方法については、「 PowerShell モジュールの作成」を参照してください。

Note

PowerShell 3.0 より前では、コマンドレットとプロバイダーは PowerShell スナップインにパッケージ化されていました。PowerShell 3.0 以降では、既定ですべてのセッションに Microsoft.PowerShell.Core スナップインが追加されます。 これは、PowerShell に残っている唯一のスナップインです。 他のすべてのスナップインはモジュールに変換されました。 新しいスナップインの作成はサポートされなくなりました。

既定のモジュールの場所

PowerShell は、モジュールを次の既定の場所に格納します。

  • すべてのユーザー スコープ - $env:ProgramFiles\WindowsPowerShell\Modules
  • 現在のユーザー スコープ - $HOME\Documents\WindowsPowerShell\Modules
  • PowerShell に付属するモジュール - $PSHOME\Modules

既定では、現在のユーザーの Modules フォルダーは存在しません。 Install-ModuleまたはInstall-PSResourceを使用してCurrentUser スコープにモジュールをインストールした場合、これらのコマンドレットによって現在のユーザーのModules フォルダーが作成されます。 フォルダーが存在しない場合は、手動で作成できます。

次のコマンドを使用して、現在のユーザーの Modules フォルダーを作成します。

$folder = New-Item -Type Directory -Path $HOME\Documents\WindowsPowerShell\Modules

これらの場所は、 $env:PSModulePath 環境変数に自動的に含まれます。 既定のモジュールの場所の詳細については、 about_PSModulePathを参照してください。

モジュールの自動読み込み

インストールされているモジュールからコマンドを初めて実行すると、PowerShell によってそのモジュールが自動的にインポート (読み込み) されます。 モジュールは、 $env:PSModulePath 環境変数で指定された場所に格納する必要があります。

モジュールの自動読み込みでは、セットアップやプロファイルの構成なしで、モジュール内のコマンドを使用できます。 次の各例では、Get-CimInstanceを含む CimCmdlets モジュールがセッションにインポートされます。

  • コマンドを実行する

    Get-CimInstance Win32_OperatingSystem
    
  • コマンドを取得する

    Get-Command Get-CimInstance
    
  • コマンドのヘルプを表示する

    Get-Help Get-CimInstance
    

ワイルドカード文字 (*) でGet-Commandを使用する場合、PowerShell はモジュールをインポートしません。 セッションで不要なモジュールを読み込まずに、コマンド検出にワイルドカードを使用できます。

モジュールを手動でインポートする

$env:PSModulePath環境変数で指定された場所にモジュールがインストールされていない場合、またはモジュールがパッケージ化されたモジュールではなく、スタンドアロンの.dllまたは.psm1 ファイルとして提供されている場合は、モジュールを手動でインポートする必要があります。

また、PowerShell プロバイダーを使用するコマンドは、モジュールを自動的にインポートしません。 たとえば、Get-PSSessionConfiguration コマンドレットなど、WSMan: ドライブを必要とするコマンドを使用する場合は、Import-Module コマンドレットを実行して、WSMan: ドライブを含む Microsoft.WSMan.Management モジュールをインポートする必要があります。

また、モジュールをセッションにインポートする方法を変更することもできます。 たとえば、Import-ModulePrefix パラメーターは、モジュールからインポートされたコマンドレットの名詞部分に固有のプレフィックスを追加します。 NoClobber パラメーターを指定すると、モジュールはセッション内の既存のコマンドを非表示にしたり置き換えたりするコマンドを追加できなくなります。 詳細については、「 管理名の競合」を参照してください。

次の例では、 BitsTransfer モジュールを現在のセッションにインポートします。

Import-Module BitsTransfer

$env:PSModulePathにないモジュールをインポートするには、モジュール フォルダーへの完全修飾パスを使用します。 たとえば、C:\ps-test ディレクトリの TestCmdlets モジュールをセッションに追加するには、次のように入力します。

Import-Module C:\ps-test\TestCmdlets

モジュール フォルダーに含まれていないモジュール ファイルをインポートするには、コマンド内のモジュール ファイルへの完全修飾パスを使用します。 たとえば、 C:\ps-test ディレクトリの TestCmdlets.dll モジュールをセッションに追加するには、次のように入力します。

Import-Module C:\ps-test\TestCmdlets.dll

セッションへのモジュールの追加の詳細については、「 Import-Module」を参照してください。

すべてのセッションの開始時にモジュールをインポートする

Import-Module コマンドは、モジュールを現在の PowerShell セッションにインポートします。 開始するすべての PowerShell セッションにモジュールをインポートするには、 Import-Module コマンドを PowerShell プロファイルに追加します。

プロファイルの詳細については、「about_Profiles」を参照してください。

発行済みモジュールをインストールする

発行済みモジュールは、PowerShell ギャラリーなどの登録済みリポジトリから使用できるモジュールです。 PowerShellGetMicrosoft.PowerShell.PSResourceGet モジュールと Microsoft.PowerShell.PSResourceGet モジュールは、登録されたリポジトリに PowerShell モジュールを検索、インストール、発行するためのコマンドレットを提供します。

PowerShellGet モジュールは、PowerShell 5.0 以降のリリースに含まれています。 Microsoft.PowerShell.PSResourceGet モジュールは PowerShell 7.4 以降のリリースに含まれており、PowerShell の推奨パッケージ マネージャーです。 Microsoft.PowerShell.PSResourceGet は、 PowerShellGet と並べて、古いバージョンの PowerShell にインストールできます。 PowerShell ギャラリーからモジュールをインストールするには、Install-ModuleまたはInstall-PSResourceコマンドレットを使用します。

 Get-Command Install-Module, Install-PSResource
CommandType  Name                Version    Source
-----------  ----                -------    ------
Function     Install-Module      2.9.0      PowerShellGet
Cmdlet       Install-PSResource  1.0.0      Microsoft.PowerShell.PSResourceGet

詳細については、「 PowerShellGet の概要を参照してください。

モジュールを手動でインストールする

モジュールの内容を別のフォルダーからコピーすることで、モジュールを手動でインストールできます。 そのフォルダーは、ローカル コンピューター上の別の場所に配置することも、別のコンピューターにインストールすることもできます。 モジュールを手動でインストールするには、モジュール フォルダー全体を、 $env:PSModulePathに含まれる新しい場所にコピーします。

PowerShell では、 Copy-Item コマンドレットを使用します。 たとえば、次のコマンドを実行して、C:\PSTestから MyModule フォルダーをコピーします。

$modulePath = $HOME\Documents\PowerShell\Modules\MyModule
Copy-Item -Path C:\PSTest\MyModule\* -Destination $modulePath -Recurse

モジュールはどこにインストールしても構いませんが、モジュールの既定の場所にモジュールをインストールすれば、管理しやすくなります。

インストールされているモジュールを検索する

Get-Module コマンドレットは、現在の PowerShell セッションに読み込まれた PowerShell モジュールを取得します。

Get-Module

一覧表示されているモジュールには、 $env:PSModulePathからだけでなく、任意の場所からインポートされたモジュールを含めることができます。

次のコマンドを使用して、 $env:PSModulePathにインストールされているモジュールを一覧表示します。

Get-Module -ListAvailable

このコマンドは、現在のセッションにインポートされるモジュールだけでなく、 $env:PSModulePathにインストールされているすべてのモジュールを取得します。 このコマンドでは、他の場所にインストールされているモジュールは一覧表示されません。

詳細については、「 Get-Module」を参照してください。

モジュール内のコマンドを一覧表示する

Get-Command コマンドレットを使用して、使用可能なすべてのコマンドを見つけます。 Get-Command コマンドレットのパラメーターを使用して、モジュール、名前、名詞などのコマンドをフィルター処理できます。

モジュール内のすべてのコマンドを検索するには、次のように入力します。

Get-Command -Module <module-name>

たとえば、 BitsTransfer モジュールでコマンドを検索するには、次のように入力します。

Get-Command -Module BitsTransfer

Get-Command コマンドレットの詳細については、「Get-Command」を参照してください。

モジュールの削除

モジュールを削除すると、モジュールが追加したコマンドがセッションから削除されます。 たとえば、次のコマンドは、現在のセッションから BitsTransfer モジュールを削除します。

Remove-Module BitsTransfer

モジュールを削除では、モジュールのインポートの反対の操作が行われます。 モジュールを削除しても、モジュールはアンインストールされません。 詳細については、「 Remove-Module」を参照してください。

コマンドは、モジュールとスナップインからセッションに追加できます。モジュールでは、コマンドレット、プロバイダー、関数、変数、エイリアス、PowerShell ドライブなどの項目など、すべての種類のコマンドを追加できます。 スナップインはコマンドレットとプロバイダーのみを追加できます。

セッションからモジュールを削除する前に、次のコマンドを使用して、削除するモジュールを決定します。

たとえば、次のコマンドを使用して、 Get-Date コマンドレットと Get-Help コマンドレットのソースを検索します。

Get-Command Get-Date, Get-Help -All |
    Select-Object -Property Name, CommandType, Module ,PSSnapIn

次の出力は、 Get-Help コマンドレットが Microsoft.PowerShell.Core スナップインにあることを示しています。 このスナップインをセッションから削除することはできません。

Name     CommandType Module                       PSSnapIn
----     ----------- ------                       --------
Get-Date    Function
Get-Date      Cmdlet Microsoft.PowerShell.Utility
Get-Help      Cmdlet                              Microsoft.PowerShell.Core

Get-Dateには 2 つのソースがあります。 1 つは関数で、もう 1 つは Microsoft.PowerShell.Utility モジュールのコマンドレットです。 Remove-Moduleを使用してモジュールを削除できます。 関数を削除するには、 Function: ドライブから削除します。

Remove-Item Function:Get-Date

Function: ドライブの詳細については、「about_Function_Provider」を参照してください。

名前の競合を管理する

名前の競合は、セッションの複数のコマンドの名前が同じときに発生します。 モジュールのコマンドの名前がセッションのコマンドまたはアイテムの名前と同じとき、モジュールをインポートすると名前の競合が発生します。

Import-Module は、現在のセッションでコマンドを非表示にして置き換えるコマンドを追加する場合があります。 名前が競合していると、コマンドが隠されたり、置換されたりします。 コマンドの置換は、インポートされたモジュールにセッション内の既存のコマンドと同じ名前のコマンドが含まれている場合に発生します。 新しくインポートされたコマンドは、既存のコマンドよりも優先されます。

たとえば、セッションに同じ名前の関数とコマンドレットが含まれている場合、PowerShell は既定で関数を実行します。 セッションに種類と名前が同じコマンドが含まれるとき、たとえば、2 つのコマンドレットの名前が同じ場合、既定では追加された日が新しいほうのコマンドが実行されます。

優先順位規則の説明や非表示コマンドの実行手順など、詳細については、 about_Command_Precedenceを参照してください。

コマンド名を修飾することで、非表示または置換されたコマンドを実行できます。 コマンド名を修飾するには、目的のコマンドのバージョンを含むモジュールの名前を追加します。 次に例を示します。

Microsoft.PowerShell.Utility\Get-Date

モジュール名のプレフィックスで Get-Date を実行すると、 Microsoft.PowerShell.Utility モジュールのバージョンが確実に実行されます。

名前の競合を検出するには、Get-Command コマンドレットの All パラメーターを使用します。 既定では、 Get-Command はコマンド名を入力したときに実行されるコマンドのみを取得します。 All パラメーターは、セッション内の特定の名前を持つすべてのコマンドを取得します。

名前の競合を防ぐには、Import-Module コマンドレットの NoClobber または Prefix パラメーターを使用します。 Prefix パラメーターは、セッション内で一意になるように、インポートされたコマンドの名前にプレフィックスを追加します。 NoClobber パラメーターは、セッション内の既存のコマンドを非表示にしたり置き換えたりするコマンドをインポートしません。

AliasCmdletFunction、および Variable Import-Module パラメーターを使用して、インポートするコマンドのみを選択し、セッションで名前の競合を引き起こすコマンドを除外することもできます。

モジュール作成者は、モジュール マニフェストの DefaultCommandPrefix プロパティを使用して、すべてのコマンド名に既定のプレフィックスを追加することで、名前の競合を防ぐことができます。 Prefix パラメーターの値は、DefaultCommandPrefix の値よりも優先されます。

関連項目