Freigeben über


Erstellen eines Cmdlet ohne Parameter

In diesem Abschnitt wird beschrieben, wie Sie ein Cmdlet erstellen, das Informationen vom lokalen Computer ohne Die Verwendung von Parametern abruft, und schreibt dann die Informationen in die Pipeline. Das hier beschriebene Cmdlet ist ein Get-Proc-Cmdlet, das Informationen über die Prozesse des lokalen Computers abruft, und zeigt diese Informationen dann an der Befehlszeile an.

Hinweis

Beachten Sie, dass beim Schreiben von Cmdlets die Windows PowerShell-Referenzassemblys® auf den Datenträger heruntergeladen werden (standardmäßig unter "C:\Programme\Referenzassemblys\Microsoft\WindowsPowerShell\v1.0"). Sie werden nicht im globalen Assemblycache (Global Assembly Cache, GAC) installiert.

Benennen des Cmdlets

Ein Cmdlet-Name besteht aus einem Verb, das die Aktion angibt, die das Cmdlet ausführt, und ein Substantiv, das die Elemente angibt, auf die das Cmdlet wirkt. Da dieses Beispiel Get-Proc Cmdlet Prozessobjekte abruft, verwendet es das Verb "Get", das durch die System.Management.Automation.VerbsCommon Enumeration definiert ist, und das Substantiv "Proc", um anzugeben, dass das Cmdlet für Prozesselemente funktioniert.

Verwenden Sie beim Benennen von Cmdlets keines der folgenden Zeichen: # , () {} [] & - /\ $ ; : " '<> | ? @ ` .

Auswählen eines Substantivs

Sie sollten ein spezifisches Substantiv auswählen. Es empfiehlt sich, ein Singular-Substantiv zu verwenden, dem eine gekürzte Version des Produktnamens vorangestellt ist. Ein Beispiel für einen Cmdlet-Namen dieses Typs ist "Get-SQLServer".

Auswählen eines Verbs

Sie sollten ein Verb aus der Gruppe genehmigter Cmdlet-Verbnamen verwenden. Weitere Informationen zu den genehmigten Cmdlet-Verben finden Sie unter Cmdlet Verb Names.

Definieren der Cmdlet-Klasse

Nachdem Sie einen Cmdlet-Namen ausgewählt haben, definieren Sie eine .NET-Klasse, um das Cmdlet zu implementieren. Dies ist die Klassendefinition für dieses BeispielGet-Proc-Cmdlet:

[Cmdlet(VerbsCommon.Get, "Proc")]
  public class GetProcCommand : Cmdlet
<Cmdlet(VerbsCommon.Get, "Proc")> _
Public Class GetProcCommand
    Inherits Cmdlet

Beachten Sie, dass vor der Klassendefinition das System.Management.Automation.CmdletAttribute Attribut mit der Syntax [Cmdlet(verb, noun, ...)]verwendet wird, um diese Klasse als Cmdlet zu identifizieren. Dies ist das einzige erforderliche Attribut für alle Cmdlets, und es ermöglicht der Windows PowerShell-Runtime, sie richtig aufzurufen. Sie können Attributstichwörter festlegen, um die Klasse bei Bedarf weiter zu deklarieren. Beachten Sie, dass die Attributdeklaration für unsere GetProcCommand-Beispielklasse nur die Substantiv- und Verbnamen für das Cmdlet Get-Proc deklariert.

Hinweis

Bei allen Windows PowerShell-Attributklassen entsprechen die Schlüsselwörter, die Sie festlegen können, den Eigenschaften der Attributklasse.

Beim Benennen der Klasse des Cmdlets empfiehlt es sich, den Cmdletnamen im Klassennamen widerzuspiegeln. Verwenden Sie dazu das Formular "VerbNounCommand" und ersetzen Sie "Verb" und "Nomen" durch das Verb und das Substantiv, das im Cmdlet-Namen verwendet wird. Wie in der vorherigen Klassendefinition gezeigt, definiert das Cmdlet Get-Proc Beispiel eine Klasse namens "GetProcCommand", die von der System.Management.Automation.Cmdlet Basisklasse abgeleitet wird.

Wichtig

Wenn Sie ein Cmdlet definieren möchten, das direkt auf die Windows PowerShell-Laufzeit zugreift, sollte Ihre .NET-Klasse von der System.Management.Automation.PSCmdlet Basisklasse abgeleitet werden. Weitere Informationen zu dieser Klasse finden Sie unter Erstellen eines Cmdlets, das Parametersätze definiert.

Hinweis

Die Klasse für ein Cmdlet muss explizit als öffentlich gekennzeichnet werden. Klassen, die nicht als öffentlich gekennzeichnet sind, werden standardmäßig intern und von der Windows PowerShell-Runtime nicht gefunden.

Windows PowerShell verwendet den Microsoft.PowerShell.Commands Namespace für seine Cmdlet-Klassen. Es wird empfohlen, Ihre Cmdlet-Klassen in einem Commands-Namespace Ihres API-Namespaces zu platzieren, z. B. xxx.PS. Befehle.

Überschreiben einer Eingabeverarbeitungsmethode

Die System.Management.Automation.Cmdlet Klasse stellt drei Haupteingabeverarbeitungsmethoden bereit, von denen ihr Cmdlet außer Kraft setzen muss. Weitere Informationen dazu, wie Windows PowerShell Datensätze verarbeitet, finden Sie unter How Windows PowerShell Works.

Für alle Eingabetypen ruft die Windows PowerShell-Laufzeit System.Management.Automation.Cmdlet.BeginProcessing auf, um die Verarbeitung zu aktivieren. Wenn Ihr Cmdlet eine Vorverarbeitung oder Einrichtung durchführen muss, kann dies durch Überschreiben dieser Methode erfolgen.

Hinweis

Windows PowerShell verwendet den Begriff "Record", um den Satz von Parameterwerten zu beschreiben, die angegeben werden, wenn ein Cmdlet aufgerufen wird.

Wenn Ihr Cmdlet Pipelineeingaben akzeptiert, muss es die System.Management.Automation.Cmdlet.ProcessRecord-Methode und optional die System.Management.Automation.Cmdlet.EndProcessing-Methode überschreiben. Ein Cmdlet kann z. B. beide Methoden außer Kraft setzen, wenn alle Eingaben mithilfe von System.Management.Automation.Cmdlet.ProcessRecord gesammelt werden, und dann wird die Eingabe als Ganzes anstelle eines Elements gleichzeitig ausgeführt, wie das cmdlet Sort-Object.

Wenn Ihr Cmdlet keine Pipelineeingaben verwendet, sollte die System.Management.Automation.Cmdlet.EndProcessing-Methode außer Kraft setzen. Beachten Sie, dass diese Methode häufig anstelle von System.Management.Automation.Cmdlet.BeginProcessing verwendet wird, wenn das Cmdlet nicht gleichzeitig für ein Element verwendet werden kann, wie bei einem Sortier-Cmdlet.

Da dieses Beispiel-Get-Proc-Cmdlet Pipelineeingaben empfangen muss, überschreibt es die methode System.Management.Automation.Cmdlet.ProcessRecord und verwendet die Standardimplementierungen für System.Management.Automation.Cmdlet.BeginProcessing und System.Management.Automation.Cmdlet.EndProcessing. Die System.Management.Automation.Cmdlet.ProcessRecord Außerkraftsetzung ruft Prozesse ab und schreibt sie mithilfe der System.Management.Automation.Cmdlet.WriteObject-Methode in die Befehlszeile.

protected override void ProcessRecord()
{
  // Get the current processes
  Process[] processes = Process.GetProcesses();

  // Write the processes to the pipeline making them available
  // to the next cmdlet. The second parameter of this call tells
  // PowerShell to enumerate the array, and send one process at a
  // time to the pipeline.
  WriteObject(processes, true);
}
Protected Overrides Sub ProcessRecord()

    '/ Get the current processes.
    Dim processes As Process()
    processes = Process.GetProcesses()

    '/ Write the processes to the pipeline making them available
    '/ to the next cmdlet. The second parameter of this call tells
    '/ PowerShell to enumerate the array, and send one process at a
    '/ time to the pipeline.
    WriteObject(processes, True)

End Sub 'ProcessRecord

Wichtige Informationen zur Eingabeverarbeitung

  • Die Standardquelle für die Eingabe ist ein explizites Objekt (z. B. eine Zeichenfolge), das vom Benutzer in der Befehlszeile bereitgestellt wird. Weitere Informationen finden Sie unter Erstellen eines Cmdlets zum Verarbeiten der Befehlszeileneingabe.

  • Eine Eingabeverarbeitungsmethode kann auch Eingaben aus dem Ausgabeobjekt eines upstream-Cmdlets in der Pipeline empfangen. Weitere Informationen finden Sie unter Erstellen eines Cmdlets zum Verarbeiten von Pipelineeingaben. Beachten Sie, dass Ihr Cmdlet Eingaben aus einer Kombination aus Befehlszeilen- und Pipelinequellen empfangen kann.

  • Das nachgeschaltete Cmdlet gibt möglicherweise nicht lange oder gar nicht zurück. Aus diesem Grund sollte die Eingabeverarbeitungsmethode in Ihrem Cmdlet keine Sperren bei Aufrufen von System.Management.Automation.Cmdlet.WriteObjectenthalten, insbesondere Sperren, für die der Bereich über die Cmdlet-Instanz hinausgeht.

Wichtig

Cmdlets sollten niemals System.Console.Writeline* oder dessen Entsprechung aufrufen.

Beispielsweise werden System.Management.Automation.Cmdlet.EndProcessing möglicherweise nicht aufgerufen, wenn das Cmdlet mitte des Weges abgebrochen wird oder ein Beendigungsfehler in einem Teil des Cmdlets auftritt. Daher sollte ein Cmdlet, das die Objektbereinigung erfordert, das vollständige System.IDisposable Muster implementieren, einschließlich des Finalizers, damit die Laufzeit sowohl System.Management.Automation.Cmdlet.EndProcessing als auch System.IDisposable.Dispose* am Ende der Verarbeitung aufrufen kann.

Codebeispiel

Den vollständigen C#-Beispielcode finden Sie unter GetProcessSample01 Sample.

Definieren von Objekttypen und Formatierungen

Windows PowerShell übergibt Informationen zwischen Cmdlets mithilfe von .NET-Objekten. Daher muss ein Cmdlet möglicherweise einen eigenen Typ definieren, oder das Cmdlet muss einen vorhandenen Typ erweitern, der von einem anderen Cmdlet bereitgestellt wird. Weitere Informationen zum Definieren neuer Typen oder zum Erweitern vorhandener Typen finden Sie unter Erweitern von Objekttypen und Formatierungen.

Erstellen des Cmdlets

Nach der Implementierung eines Cmdlets müssen Sie es über ein Windows PowerShell-Snap-In bei Windows PowerShell registrieren. Weitere Informationen zum Registrieren von Cmdlets finden Sie unter Registrieren von Cmdlets, Anbietern und Hostanwendungen.

Testen des Cmdlets

Wenn Ihr Cmdlet bei Windows PowerShell registriert wurde, können Sie es testen, indem Sie es in der Befehlszeile ausführen. Der Code für unser Beispiel-Get-Proc-Cmdlet ist klein, verwendet aber weiterhin die Windows PowerShell-Runtime und ein vorhandenes .NET-Objekt, das ausreicht, um es nützlich zu machen. Testen wir es, um besser zu verstehen, was Get-Proc tun und wie seine Ausgabe verwendet werden kann. Weitere Informationen zur Verwendung von Cmdlets über die Befehlszeile finden Sie in der Erste Schritte mit Windows PowerShell.

  1. Starten Sie Windows PowerShell, und rufen Sie die aktuellen Prozesse ab, die auf dem Computer ausgeführt werden.

    Get-Proc
    

    Die folgende Ausgabe wird angezeigt.

    Handles  NPM(K)  PM(K)  WS(K)  VS(M)  CPU(s)  Id   ProcessName
    -------  ------  -----  -----  -----  ------  --   ----------
    254      7       7664   12048  66     173.75  1200  QCTRAY
    32       2       1372   2628   31       0.04  1860  DLG
    271      6       1216   3688   33       0.03  3816  lg
    27       2       560    1920   24       0.01  1768  TpScrex
    ...
    
  2. Weisen Sie den Cmdlet-Ergebnissen eine Variable für eine einfachere Manipulation zu.

    $p=Get-Proc
    
  3. Ruft die Anzahl der Prozesse ab.

    $p.Length
    

    Die folgende Ausgabe wird angezeigt.

    63
    
  4. Dient zum Abrufen eines bestimmten Prozesses.

    $p[6]
    

    Die folgende Ausgabe wird angezeigt.

    Handles  NPM(K)  PM(K)  WS(K)  VS(M)  CPU(s)  Id    ProcessName
    -------  ------  -----  -----  -----  ------  --    -----------
    1033     3       2400   3336   35     0.53    1588  rundll32
    
  5. Rufen Sie die Startzeit dieses Prozesses ab.

    $p[6].StartTime
    

    Die folgende Ausgabe wird angezeigt.

    Tuesday, July 26, 2005 9:34:15 AM
    
    $p[6].StartTime.DayOfYear
    
    207
    
  6. Rufen Sie die Prozesse ab, für die die Handleanzahl größer als 500 ist, und sortieren Sie das Ergebnis.

    $p | Where-Object {$_.HandleCount -gt 500 } | Sort-Object HandleCount
    

    Die folgende Ausgabe wird angezeigt.

    Handles  NPM(K)  PM(K)  WS(K)  VS(M)  CPU(s)  Id   ProcessName
    -------  ------  -----  -----  -----  ------  --   ----------
    568      14      2164   4972   39     5.55    824  svchost
    716       7      2080   5332   28    25.38    468  csrss
    761      21      33060  56608  440  393.56    3300 WINWORD
    791      71      7412   4540   59     3.31    492  winlogon
    ...
    
  7. Verwenden Sie das Cmdlet Get-Member, um die für jeden Prozess verfügbaren Eigenschaften aufzulisten.

    $p | Get-Member -MemberType Property
    
        TypeName: System.Diagnostics.Process
    

    Die folgende Ausgabe wird angezeigt.

    Name                     MemberType Definition
    ----                     ---------- ----------
    BasePriority             Property   System.Int32 BasePriority {get;}
    Container                Property   System.ComponentModel.IContainer Conta...
    EnableRaisingEvents      Property   System.Boolean EnableRaisingEvents {ge...
    ...
    

Siehe auch

Erstellen eines Cmdlets zum Verarbeiten der Befehlszeileneingabe

Erstellen eines Cmdlets zum Verarbeiten von Pipelineeingaben

Erstellen eines Windows PowerShell-Cmdlets

Erweitern von Objekttypen und Formatierungen

Funktionsweise von Windows PowerShell

Registrieren von Cmdlets, Anbietern und Hostanwendungen

Windows PowerShell-Referenz-

Cmdlet-Beispiele