Cmdlet-Übersicht

Ein Cmdlet ist ein schlanker Befehl, der in der PowerShell-Umgebung verwendet wird. Die PowerShell-Runtime ruft diese Cmdlets im Kontext von Automatisierungsskripts auf, die in der Befehlszeile bereitgestellt werden. Die PowerShell-Runtime ruft sie auch programmgesteuert über PowerShell-APIs auf.

Cmdlets

Cmdlets führen eine Aktion aus und geben in der Regel ein Microsoft .NET-Objekt an den nächsten Befehl in der Pipeline zurück. Ein Cmdlet ist ein einzelner Befehl, der an der Pipelinesemantik von PowerShell beteiligt ist. Dies schließt binäre (C#-) Cmdlets, erweiterte Skriptfunktionen, CDXML und Workflows ein.

In dieser SDK-Dokumentation wird beschrieben, wie In C# geschriebene binäre Cmdlets erstellt werden. Informationen zu skriptbasierten Cmdlets finden Sie unter:

Um ein binäres Cmdlet zu erstellen, müssen Sie eine Cmdlet-Klasse implementieren, die von einer von zwei spezialisierten Cmdlet-Basisklassen abgeleitet wird. Die abgeleitete Klasse muss:

  • Deklarieren Sie ein Attribut, das die abgeleitete Klasse als Cmdlet identifiziert.
  • Definieren Sie öffentliche Eigenschaften, die mit Attributen versehen sind, die die öffentlichen Eigenschaften als Cmdlet-Parameter identifizieren.
  • Überschreiben Sie eine oder mehrere Eingabeverarbeitungsmethoden, um Datensätze zu verarbeiten.

Sie können die Assembly, die die Klasse enthält, direkt laden, indem Sie das Import-Module-Cmdlet verwenden, oder Sie können eine Hostanwendung erstellen, die die Assembly mithilfe der System.Management.Automation.Runspaces.Initialsessionstate-API lädt. Beide Methoden bieten programmgesteuerten und Befehlszeilenzugriff auf die Funktionalität des Cmdlets.

Cmdlet-Begriffe

Die folgenden Begriffe werden häufig in der PowerShell-Cmdlet-Dokumentation verwendet:

Cmdlet-Attribut

Ein .NET-Attribut, das verwendet wird, um eine Cmdlet-Klasse als Cmdlet zu deklarieren. Obwohl PowerShell mehrere andere attribute verwendet, die optional sind, ist das Cmdlet-Attribut erforderlich. Weitere Informationen zu diesem Attribut finden Sie unter Cmdlet-Attributdeklaration.

Cmdlet-Parameter

Die öffentlichen Eigenschaften, die die Parameter definieren, die für den Benutzer oder die Anwendung verfügbar sind, die das Cmdlet ausführt. Cmdlets können über erforderliche, benannte, positions- und switch-Parameter verfügen. Switch-Parameter ermöglichen es Ihnen, Parameter zu definieren, die nur ausgewertet werden, wenn die Parameter im Aufruf angegeben sind. Weitere Informationen zu den verschiedenen Parametertypen finden Sie unter Cmdlet-Parameter.

Parametersatz

Gruppe von Parametern, die im selben Befehl verwendet werden kann, um eine bestimmte Aktion auszuführen. Ein Cmdlet kann über mehrere Parametersätze verfügen, aber jeder Parametersatz muss mindestens einen eindeutigen Parameter aufweisen. Ein guter Cmdlet-Entwurf schlägt dringend vor, dass der eindeutige Parameter auch ein erforderlicher Parameter ist. Weitere Informationen zu Parametersätzen finden Sie unter Cmdlet-Parametersätze.

Dynamischer Parameter

Ein Parameter, der dem Cmdlet zur Laufzeit hinzugefügt wird. In der Regel werden die dynamischen Parameter dem Cmdlet hinzugefügt, wenn ein anderer Parameter auf einen bestimmten Wert festgelegt ist. Weitere Informationen zu dynamischen Parametern finden Sie unter Cmdlet Dynamic Parameters.

Eingabeverarbeitungsmethoden

Die System.Management.Automation.Cmdlet-Klasse stellt die folgenden virtuellen Methoden bereit, die zum Verarbeiten von Datensätzen verwendet werden. Alle abgeleiteten Cmdlet-Klassen müssen mindestens eine der ersten drei Methoden überschreiben:

Weitere Informationen zu diesen Methoden finden Sie unter Cmdlet Input Processing Methods.

Wenn Sie ein Cmdlet implementieren, müssen Sie mindestens eine dieser Eingabeverarbeitungsmethoden überschreiben. In der Regel ist ProcessRecord() die Methode, die Sie überschreiben, da sie für jeden Datensatz aufgerufen wird, den das Cmdlet verarbeitet. Im Gegensatz dazu werden die BeginProcessing()-Methode und die EndProcessing()-Methode einmal aufgerufen, um die Vor- oder Nachverarbeitung der Datensätze durchzuführen. Weitere Informationen zu diesen Methoden finden Sie unter Eingabeverarbeitungsmethoden.

ShouldProcess-Feature

Mit PowerShell können Sie Cmdlets erstellen, die den Benutzer zur Eingabe von Feedback auffordern, bevor das Cmdlet eine Änderung am System vornimmt. Um dieses Feature verwenden zu können, muss das Cmdlet deklarieren, dass es das ShouldProcess Feature unterstützt, wenn Sie das Cmdlet-Attribut deklarieren, und das Cmdlet muss die Methoden System.Management.Automation.Cmdlet.ShouldProcess und System.Management.Automation.Cmdlet.ShouldContinue innerhalb einer Eingabeverarbeitungsmethode aufrufen. Weitere Informationen zur Unterstützung der ShouldProcess Funktionalität finden Sie unter Anfordern einer Bestätigung.

Transaktion

Eine logische Gruppe von Befehlen, die als einzelne Aufgabe behandelt werden. Die Aufgabe schlägt automatisch fehl, wenn ein Befehl in der Gruppe fehlschlägt, und der Benutzer die Möglichkeit hat, die innerhalb der Transaktion ausgeführten Aktionen zu akzeptieren oder abzulehnen. Um an einer Transaktion teilzunehmen, muss das Cmdlet deklarieren, dass es Transaktionen unterstützt, wenn das Cmdlet-Attribut deklariert wird. Die Unterstützung für Transaktionen wurde in Windows PowerShell 2.0 eingeführt. Weitere Informationen zu Transaktionen finden Sie unter How to Support Transactions.

Unterschiede zwischen Cmdlets und Befehlen

Cmdlets unterscheiden sich wie folgt von Befehlen in anderen Befehlsshellumgebungen:

  • Cmdlets sind Instanzen von .NET-Klassen. sie sind keine eigenständigen ausführbaren Dateien.
  • Cmdlets können aus bis zu einem Dutzend Codezeilen erstellt werden.
  • Cmdlets verwenden im Allgemeinen keine eigene Analyse, Fehlerdarstellung oder Ausgabeformatierung. Analyse, Fehlerdarstellung und Ausgabeformatierung werden von der PowerShell-Runtime verarbeitet.
  • Cmdlets verarbeiten Eingabeobjekte aus der Pipeline und nicht aus Textdatenströmen, und Cmdlets übermitteln Objekte in der Regel als Ausgabe an die Pipeline.
  • Cmdlets sind datensatzorientiert, da sie ein einzelnes Objekt gleichzeitig verarbeiten.

Cmdlet-Basisklassen

Windows PowerShell unterstützt Cmdlets, die von den folgenden beiden Basisklassen abgeleitet sind.

  • Die meisten Cmdlets basieren auf .NET-Klassen, die von der Basisklasse System.Management.Automation.Cmdlet abgeleitet werden. Die Ableitung von dieser Klasse ermöglicht einem Cmdlet die Verwendung des mindesten Satzes von Abhängigkeiten von der Windows PowerShell Runtime. Dies hat zwei Vorteile. Der erste Vorteil besteht darin, dass die Cmdlet-Objekte kleiner sind und Sie weniger wahrscheinlich von Änderungen an der PowerShell-Runtime betroffen sind. Der zweite Vorteil besteht darin, dass Sie bei Bedarf direkt eine Instanz des Cmdlet-Objekts erstellen und dann direkt aufrufen können, anstatt sie über die PowerShell-Runtime aufzurufen.

  • Die komplexeren Cmdlets basieren auf .NET-Klassen, die von der Basisklasse System.Management.Automation.PSCmdlet abgeleitet werden. Durch ableiten von dieser Klasse erhalten Sie viel mehr Zugriff auf die PowerShell-Runtime. Dieser Zugriff ermöglicht Ihrem Cmdlet, Skripts aufzurufen, auf Anbieter zuzugreifen und auf den aktuellen Sitzungszustand zuzugreifen. (Um auf den aktuellen Sitzungszustand zuzugreifen, können Sie Sitzungsvariablen und -einstellungen abrufen und festlegen.) Die Ableitung von dieser Klasse erhöht jedoch die Größe des Cmdlet-Objekts. Dies bedeutet, dass Ihr Cmdlet enger an die aktuelle Version der PowerShell-Runtime gekoppelt ist.

Im Allgemeinen sollten Sie von der System.Management.Automation.Cmdlet-Klasse ableiten, es sei denn, Sie benötigen den erweiterten Zugriff auf die PowerShell-Runtime. Die PowerShell-Runtime verfügt jedoch über umfangreiche Protokollierungsfunktionen für die Ausführung von Cmdlets. Wenn Ihr Überwachungsmodell von dieser Protokollierung abhängt, können Sie die Ausführung Ihres Cmdlets innerhalb eines anderen Cmdlets verhindern, indem Sie von der System.Management.Automation.PSCmdlet-Klasse ableiten.

Cmdlet-Attribute

PowerShell definiert mehrere .NET-Attribute, die zum Verwalten von Cmdlets und zum Angeben allgemeiner Funktionen verwendet werden, die von PowerShell bereitgestellt werden und für das Cmdlet erforderlich sein können. Beispielsweise werden Attribute verwendet, um eine Klasse als Cmdlet festzulegen, die Parameter des Cmdlets anzugeben und die Validierung der Eingabe anzufordern, damit Cmdlet-Entwickler diese Funktionalität nicht in ihren Cmdlet-Code implementieren müssen. Weitere Informationen zu Attributen finden Sie unter PowerShell-Attribute.

Cmdlet-Namen

PowerShell verwendet ein Verb-Nomen-Name-Paar, um Cmdlets zu benennen. Beispielsweise wird das in PowerShell enthaltene Cmdlet Get-Command dazu verwendet, alle Cmdlets abzurufen, die in der Befehlsshell registriert sind. Das Verb gibt die Aktion an, die das Cmdlet ausführt, und das Substantiv identifiziert die Ressource, für die das Cmdlet seine Aktion ausführt.

Diese Namen werden angegeben, wenn die .NET-Klasse als Cmdlet deklariert wird. Weitere Informationen zum Deklarieren einer .NET-Klasse als Cmdlet finden Sie unter Cmdlet Attribute Declaration.

Schreiben von Cmdlet-Code

Dieses Dokument bietet zwei Möglichkeiten, um zu ermitteln, wie Cmdlet-Code geschrieben wird. Wenn Sie den Code lieber ohne ausführliche Erläuterung sehen möchten, finden Sie weitere Informationen unter Beispiele für Cmdlet-Code. Weitere Erläuterungen zum Code finden Sie in den Themen GetProc-Tutorial, StopProc-Tutorialoder SelectStr Tutorial.

Weitere Informationen zu den Richtlinien zum Schreiben von Cmdlets finden Sie unter Cmdlet Development Guidelines.

Weitere Informationen

Konzepte von PowerShell-Cmdlets

Schreiben eines PowerShell-Cmdlets

PowerShell SDK