次の方法で共有


モジュールについて

簡単な説明

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

長い説明

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

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

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

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

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

手記

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

既定のモジュールの場所

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

  • Windows の場合
    • すべてのユーザーのスコープ - $Env:ProgramFiles\PowerShell\Modules
    • 現在のユーザーのスコープ - $HOME\Documents\PowerShell\Modules
    • PowerShell に付属のモジュール - $PSHOME\Modules
  • Linux および macOS の場合
    • すべてのユーザーのスコープ - /usr/local/share/powershell/Modules
    • 現在のユーザーのスコープ - $HOME/.local/share/powershell/Modules
    • PowerShell に付属のモジュール - $PSHOME/Modules

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

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

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

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

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

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

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

  • コマンドを実行する

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

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

    Get-Help Get-CimInstance
    

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

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

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

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

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

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

Import-Module BitsTransfer

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

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 ギャラリーなどの登録済みリポジトリから使用できるモジュールです。 PowerShellGet および Microsoft.PowerShell.PSResourceGet モジュールには、登録されているリポジトリに対する PowerShell モジュールの検索、インストール、発行のためのコマンドレットが用意されています。

PowerShellGet モジュールは、PowerShell 5.0 以降のリリースに含まれています。 Microsoft.PowerShell.PSResourceGet モジュールは、PowerShell 7.4 以降のリリースに含まれており、PowerShell の推奨パッケージ マネージャーです。 Microsoft.PowerShell.PSResourceGet は、以前のバージョンの PowerShell に PowerShellGetと並べてインストールできます。 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 コマンドレットを使用します。 たとえば、次のコマンドを実行して、MyModuleから C:\PSTest フォルダーをコピーします。

$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

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

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

エイリアスコマンドレット関数、および パラメーターを使用して、インポートするコマンドのみを選択し、セッションで名前の競合を引き起こすコマンドを除外することもできます。

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

こちらも参照ください