PowerShell モジュールの作成に関する考慮事項

このドキュメントには、最適なパフォーマンスが得られるようにモジュールを作成する方法に関連するガイドラインがいくつか含まれています。

モジュール マニフェストの作成

次のガイドラインに従わないでモジュール マニフェストを作成すると、モジュールがセッションで使用されない場合であっても、一般的な PowerShell のパフォーマンスに大きな影響を与える可能性があります。

コマンドの自動検出によって各モジュールが分析され、モジュールでエクスポートされるコマンドが特定されますが、この分析には大きな負荷がかかる可能性があります。 モジュール分析の結果はユーザーごとにキャッシュされますが、初回の実行時ではキャッシュを使用できません。これは、コンテナーでの一般的なシナリオです。 モジュール分析において、エクスポートされるコマンドをマニフェストから完全に特定できる場合は、より付加の大きいモジュールの分析を回避できます。

ガイドライン

  • モジュール マニフェストの AliasesToExportCmdletsToExportFunctionsToExport の各エントリでは、ワイルドカードを使わないようにします。

  • モジュールによって特定の種類のコマンドがエクスポートされない場合は、@() を指定することにより、マニフェスト内で明示的に指定します。 エントリがないか、$null エントリの場合は、ワイルドカード * を指定するのと同じになります。

次のようなものは、可能な限り避ける必要があります。

@{
    FunctionsToExport = '*'

    # Also avoid omitting an entry, it's equivalent to using a wildcard
    # CmdletsToExport = '*'
    # AliasesToExport = '*'
}

代わりに以下を使用します。

@{
    FunctionsToExport = 'Format-Hex', 'Format-Octal'
    CmdletsToExport = @()  # Specify an empty array, not $null
    AliasesToExport = @()  # Also ensure all three entries are present
}

CDXML を避ける

モジュールの実装方法を決定するときは、主に次の 3 つの選択肢があります。

  • バイナリ (通常は C#)
  • スクリプト (PowerShell)
  • CDXML (CIM をラップする XML ファイル)

モジュールの読み込み速度が重要である場合、CDXML はバイナリ モジュールより、ほぼ 1 桁遅くなります。

バイナリ モジュールは、事前にコンパイルされており、NGen を使用してコンピューターごとに 1 回 JIT コンパイルできるため、読み込みが最速になります。

スクリプト モジュールの場合は、スクリプトをコンパイルして実行する前に PowerShell で解析する必要があるため、通常、読み込みがバイナリ モジュールより少し遅くなります。

通常、CDXML モジュールの場合は、最初に XML ファイルが解析された後、大量の PowerShell スクリプトが生成されてから解析とコンパイルが行われるため、スクリプト モジュールよりはるかに低速です。