Freigeben über


Erstellen eines Cmdlet ohne Parameter

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

Hinweis

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

Benennen des Cmdlets

Ein Cmdlet-Name besteht aus einem Verb, das die Aktion angibt, die das Cmdlet ausgeführt hat, und einem Substantiv, das die Elemente angibt, für die das Cmdlet fungiert. Da dieses Get-Proc-Beispiel-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 mit Prozesselementen funktioniert.

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

Auswählen eines Nomens

Sie sollten ein spezifisches Nomen auswählen. Es ist am besten, ein singulares Nomen mit dem Präfix einer verkürzten Version des Produktnamens zu verwenden. Ein Beispiel für einen Cmdlet-Namen dieses Typs ist " Get-SQLServer ".

Auswählen eines Verbs

Sie sollten ein Verb aus dem Satz 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 Beispiel-Get-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 Attribut System.Management.Automation.CmdletAttribute mit der Syntax verwendet wird, um diese Klasse als [Cmdlet(verb, noun, ...)] Cmdlet zu identifizieren. Dies ist das einzige erforderliche Attribut für alle Cmdlets, und es ermöglicht der Windows PowerShell Runtime, sie ordnungsgemäß auf aufruft. Sie können Attributschlüsselwörter festlegen, um die Klasse bei Bedarf weiter zu deklarieren. Beachten Sie, dass die Attributdeklaration für unsere GetProcCommand-Beispielklasse nur das Nomen und die Verbnamen für das Get-Proc deklariert.

Hinweis

Für alle Windows PowerShell Attributklassen entsprechen die Schlüsselwörter, die Sie festlegen können, den Eigenschaften der Attributklasse.

Wenn Sie die Klasse des Cmdlets benennen, ist es eine bewährte Methode, den Cmdlet-Namen im Klassennamen widerzubenennen. Verwenden Sie hierzu das Formular "VerbNounCommand", und ersetzen Sie "Verb" und "Nomen" durch das verb und nomen, das im Cmdlet-Namen verwendet wird. Wie in der vorherigen Klassendefinition gezeigt, definiert das Get-Proc-Beispiel-Cmdlet eine Klasse namens GetProcCommand, die von der Basisklasse System.Management.Automation.Cmdlet abstammt.

Wichtig

Wenn Sie ein Cmdlet definieren möchten, das direkt auf die Windows PowerShell-Runtime zutritt, sollte Ihre .NET-Klasse von der System.Management.Automation.PSCmdlet-Basisklasse ableiten. 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 markiert sind, werden standardmäßig auf intern festgelegt und werden von der Windows PowerShell gefunden.

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

Überschreiben einer Eingabeverarbeitungsmethode

Die System.Management.Automation.Cmdlet-Klasse bietet drei Hauptmethoden für die Eingabeverarbeitung, von denen ihr Cmdlet mindestens eine außer Kraft setzen muss. Weitere Informationen zum Windows PowerShell von Datensätzen finden Sie unter Funktionsweise Windows PowerShell .

Für alle Eingabetypen ruft die Windows PowerShell Runtime System.Management.Automation.Cmdlet.BeginProcessing auf, um die Verarbeitung zu aktivieren. Wenn Ihr Cmdlet vorverarbeitet oder eingerichtet werden muss, kann dies durch Überschreiben dieser Methode ausgeführt werden.

Hinweis

Windows PowerShell verwendet den Begriff "Datensatz", um den Satz von Parameterwerten zu beschreiben, der beim Aufgerufen eines Cmdlets angegeben 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. Beispielsweise kann ein Cmdlet beide Methoden überschreiben, wenn es alle Eingaben mit System.Management.Automation.Cmdlet.ProcessRecord sammelt und dann wie das Cmdlet die Eingabe als Ganzes und nicht mit einem Element gleichzeitig Sort-Object verwendet.

Wenn Ihr Cmdlet keine Pipelineeingaben übernimmt, sollte es die System.Management.Automation.Cmdlet.EndProcessing-Methode überschreiben. Beachten Sie, dass diese Methode häufig statt System.Management.Automation.Cmdlet.BeginProcessing verwendet wird, wenn das Cmdlet nicht gleichzeitig mit einem Element arbeiten kann, wie es bei einem Sortier-Cmdlet der Fall ist.

Da dieses Get-Proc-Beispiel-Cmdlet Pipelineeingaben empfangen muss, überschreibt es die System.Management.Automation.Cmdlet.ProcessRecord-Methode und verwendet die Standardimplementierungen für System.Management.Automation.Cmdlet.BeginProcessing und System.Management.Automation.Cmdlet.EndProcessing. Die System.Management.Automation.Cmdlet.ProcessRecord-Überschreibung 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

Dinge, die Sie sich über die Eingabeverarbeitung merken sollten

  • 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 Downstream-Cmdlet gibt möglicherweise lange oder gar nicht zurück. Aus diesem Grund sollte die Eingabeverarbeitungsmethode in Ihrem Cmdlet keine Sperren während Aufrufen von System.Management.Automation.Cmdlet.WriteObjecthalten, insbesondere sperren, für die der Bereich über die Cmdlet-Instanz hinaus reicht.

Wichtig

Cmdlets sollten nie System.Console.Writeline* oder deren Entsprechung aufrufen.

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

Codebeispiel

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

Definieren von Objekttypen und Formatierung

Windows PowerShell übergibt Informationen zwischen Cmdlets mithilfe von .NET-Objekten. Folglich muss ein Cmdlet möglicherweise seinen eigenen Typ definieren, oder das Cmdlet muss möglicherweise 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 Formatieren von.

Erstellen des Cmdlets

Nach der Implementierung eines Cmdlets müssen Sie es über Windows PowerShell ein Windows PowerShell-Snap-In 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 wurde, können Sie es testen, indem Sie es in der Befehlszeile ausführen. Der Code für das Get-Proc-Beispiel-Cmdlet ist klein, verwendet jedoch weiterhin die Windows PowerShell-Runtime und ein vorhandenes .NET-Objekt, das ausreicht, um es nützlich zu machen. Wir testen sie, um besser zu verstehen, Get-Proc und wie ihre Ausgabe verwendet werden kann. Weitere Informationen zur Verwendung von Cmdlets über die Befehlszeile finden Sie unter Erste Schritte mit Windows PowerShell.

  1. Starten Windows PowerShell, und erhalten Sie die aktuellen Prozesse, 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 zur einfacheren Bearbeitung eine Variable zu.

    $p=get-proc
    
  3. Gibt die Anzahl der Prozesse an.

    $p.length
    

    Die folgende Ausgabe wird angezeigt.

    63
    
  4. Ruft einen bestimmten Prozess ab.

    $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. Hier erhalten Sie die Startzeit dieses Prozesses.

    $p[6].starttime
    

    Die folgende Ausgabe wird angezeigt.

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

    $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 Get-Member Cmdlet , um die für jeden Prozess verfügbaren Eigenschaften auflisten.

    $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...
    ...
    

Weitere Informationen

Erstellen eines Cmdlets zum Verarbeiten von Befehlszeileneingaben

Erstellen eines Cmdlets zum Verarbeiten von Pipelineeingaben

Erstellen eines Windows PowerShell Cmdlets

Erweitern von Objekttypen und Formatierung

Funktionsweise Windows PowerShell

Registrieren von Cmdlets, Anbietern und Hostanwendungen

Windows PowerShell-Referenz

Cmdlet-Beispiele