バイナリ モジュールには、コマンドレット クラスを含む任意のアセンブリ (.dll
) を指定できます。 既定では、バイナリ モジュールをインポートすると、アセンブリ内のすべてのコマンドレットがインポートされます。 ただし、ルート モジュールがアセンブリであるモジュール マニフェストを作成することで、インポートされるコマンドレットを制限できます。 (たとえば、マニフェストの CmdletsToExport キーを使用して、必要なコマンドレットのみをエクスポートできます)。さらに、バイナリ モジュールには、追加のファイル、ディレクトリ構造、および 1 つのコマンドレットではできない便利な管理情報を含めることができます。
次の手順では、PowerShell バイナリ モジュールを作成してインストールする方法について説明します。
PowerShell バイナリ モジュールを作成してインストールする方法
必要な機能を備えたバイナリ PowerShell ソリューション (C# で記述されたコマンドレットなど) を作成し、正しく実行されるようにします。
コードの観点から見ると、バイナリ モジュールのコアはコマンドレット アセンブリです。 実際、PowerShell では、1 つのコマンドレット アセンブリを読み込みとアンロードのモジュールとして扱います。開発者側では追加の作業は必要ありません。 コマンドレットの記述の詳細については、「Windows PowerShell コマンドレットの作成」を参照してください。
必要に応じて、ソリューションの残りの部分 (追加のコマンドレット、XML ファイルなど) を作成し、モジュール マニフェストで説明します。
モジュール マニフェストでは、ソリューション内のコマンドレット アセンブリの記述に加えて、モジュールのエクスポートとインポート方法、公開されるコマンドレット、およびモジュールに追加のファイルを記述できます。 ただし、前に説明したように、PowerShell では、追加の労力なしでバイナリ コマンドレットをモジュールのように扱うことができます。 そのため、モジュール マニフェストは、主に複数のファイルを 1 つのパッケージに結合したり、特定のアセンブリのパブリケーションを明示的に制御したりする場合に便利です。 詳細については、「PowerShell モジュール マニフェストを記述する方法」を参照してください。
次のコードは、モジュールとして使用できる同じファイルに 3 つのコマンドレットを含む簡略化された C# の例です。
using System.Management.Automation; // Windows PowerShell namespace. namespace ModuleCmdlets { [Cmdlet(VerbsDiagnostic.Test,"BinaryModuleCmdlet1")] public class TestBinaryModuleCmdlet1Command : Cmdlet { protected override void BeginProcessing() { WriteObject("BinaryModuleCmdlet1 exported by the ModuleCmdlets module."); } } [Cmdlet(VerbsDiagnostic.Test, "BinaryModuleCmdlet2")] public class TestBinaryModuleCmdlet2Command : Cmdlet { protected override void BeginProcessing() { WriteObject("BinaryModuleCmdlet2 exported by the ModuleCmdlets module."); } } [Cmdlet(VerbsDiagnostic.Test, "BinaryModuleCmdlet3")] public class TestBinaryModuleCmdlet3Command : Cmdlet { protected override void BeginProcessing() { WriteObject("BinaryModuleCmdlet3 exported by the ModuleCmdlets module."); } } }
ソリューションをパッケージ化し、PowerShell モジュール パスのどこかにパッケージを保存します。
$env:PSModulePath
グローバル環境変数は、PowerShell がモジュールの検索に使用する既定のパスを記述します。 たとえば、システムにモジュールを保存する共通パスは%SystemRoot%\Users\<user>\Documents\WindowsPowerShell\Modules\<moduleName>
です。 既定のパスを使用しない場合は、インストール時にモジュールの場所を明示的に指定する必要があります。 ソリューションの複数のアセンブリとファイルを格納するフォルダーが必要になる場合があるため、モジュールを保存するフォルダーを必ず作成してください。技術的には、モジュールを
$env:PSModulePath
上の任意の場所にインストールする必要はありません。これらは、PowerShell がモジュールを探す既定の場所にすぎません。 ただし、モジュールを別の場所に格納する正当な理由がない限り、ベスト プラクティスと見なされます。 詳細については、「PowerShell モジュールの と about_PSModulePathのインストール」を参照してください。Import-Module を呼び出して、モジュールPowerShell にインポートします。
Import-Module を呼び出すと、モジュールがアクティブ メモリに読み込まれます。 PowerShell 3.0 以降を使用している場合は、コードでモジュールからコマンドを呼び出すと、コマンドもインポートされます。 詳細については、「 PowerShell モジュールのインポート」を参照してください。
モジュールの初期化とクリーンアップ コード
モジュールが検出タスクや初期化などのインポートまたは削除時に何かを行う必要がある場合は、 IModuleAssemblyInitializer
インターフェイスと IModuleAssemblyCleanup
インターフェイスを実装できます。
注
このパターンは、絶対に必要でない限り推奨されません。 PowerShell のパフォーマンスを維持するには、インポート時ではなく、コマンドが呼び出された時点で遅延読み込みを行う必要があります。
スナップイン アセンブリをモジュールとしてインポートする
スナップイン アセンブリに存在するコマンドレットとプロバイダーは、バイナリ モジュールとして読み込むことができます。 スナップイン アセンブリがバイナリ モジュールとして読み込まれると、スナップイン内のコマンドレットとプロバイダーはユーザーが使用できますが、アセンブリ内のスナップイン クラスは無視され、スナップインは登録されません。 その結果、Windows PowerShell によって提供されるスナップイン コマンドレットは、コマンドレットとプロバイダーがセッションで使用できる場合でも、スナップインを検出できません。
さらに、スナップインによって参照される書式設定または型ファイルは、バイナリ モジュールの一部としてインポートできません。 書式設定ファイルと型ファイルをインポートするには、モジュール マニフェストを作成する必要があります。 「PowerShell モジュール マニフェストを記述する方法」を参照してください。
こちらもご覧ください
- Windows PowerShell モジュール の作成の
PowerShell