Überlegungen zur Erstellung von PowerShell-Modulen

Dieses Dokument enthält einige Richtlinien dazu, wie Sie ein Modul erstellen, um eine optimale Leistung zu erzielen.

Erstellung eines Modulmanifests

Ein Modulmanifest, bei dessen Erstellung die folgenden Richtlinien nicht beachtet wurden, kann die allgemeine PowerShell-Leistung deutlich beeinträchtigen, selbst wenn das Modul in einer Sitzung nicht verwendet wird.

Die automatische Ermittlung von Befehlen analysiert jedes Modul, um zu bestimmen, welche Befehle das Modul exportiert. Diese Analyse kann teuer sein. Die Ergebnisse der Modulanalyse werden benutzerbezogen zwischengespeichert. Der Cache ist bei der ersten Ausführung jedoch nicht verfügbar. Dies ist ein typisches Szenario bei Containern. Wenn die exportierten Befehle während der Modulanalyse vollständig aus dem Manifest bestimmt werden können, kann eine teurere Analyse des Moduls vermieden werden.

Richtlinien

  • Verwenden Sie im Modulmanifest keine Platzhalter in den Einträgen AliasesToExport, CmdletsToExport und FunctionsToExport.

  • Wenn das Modul keine Befehle eines bestimmten Typs exportiert, geben Sie dies explizit im Manifest an, indem Sie @() angeben. Ein fehlender $null-Eintrag entspricht der Angabe des Platzhalters *.

Folgendes sollte nach Möglichkeit vermieden werden:

@{
    FunctionsToExport = '*'

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

Verwenden Sie stattdessen:

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

Vermeiden von CDXML

Bei der Entscheidung, wie Sie Ihr Modul implementieren, stehen Ihnen drei primäre Optionen zur Verfügung:

  • Binärdatei (in der Regel C#)
  • Skript (PowerShell)
  • CDXML-Datei (eine XML-Datei, die das CIM umschließt)

Wenn die Geschwindigkeit beim Laden Ihres Moduls von Bedeutung ist, beachten Sie, dass CDXML ungefähr um eine Größenordnung langsamer ist als ein binäres Modul.

Ein binäres Modul wird am schnellsten geladen, da es im Voraus kompiliert wird und pro Computer einmal NGen für die JIT-Kompilierung verwenden kann.

Ein Skriptmodul wird in der Regel etwas langsamer geladen als ein binäres Modul, da PowerShell das Skript vor dem Kompilieren und Ausführen analysieren muss.

Ein CDXML-Modul ist in der Regel deutlicher langsamer als ein Skriptmodul, da es zuerst eine XML-Datei analysieren muss, die dann ein relativ großes PowerShell-Skript generiert, das wiederum analysiert und kompiliert wird.