Freigeben über


Hinzufügen von Parametern, die Pipelineeingaben verarbeiten

Eine Eingabequelle für ein Cmdlet ist ein Objekt in der Pipeline, das aus einem Upstream-Cmdlet stammt. In diesem Abschnitt wird beschrieben, wie Sie dem cmdlet Get-Proc (beschrieben unter Creating Your First Cmdlet)einen Parameter hinzufügen, damit das Cmdlet Pipelineobjekte verarbeiten kann.

Dieses Get-Proc-Cmdlet verwendet einen Parameter, der Eingaben aus einem Pipelineobjekt akzeptiert, Prozessinformationen auf der Grundlage der angegebenen Namen vom lokalen Computer abruft und dann Informationen zu den Prozessen in der Befehlszeile Name anzeigt.

Definieren der Cmdlet-Klasse

Der erste Schritt bei der Cmdlet-Erstellung besteht immer im Benennen des Cmdlets und deklarieren der .NET-Klasse, die das Cmdlet implementiert. Dieses Cmdlet ruft Prozessinformationen ab, sodass der hier ausgewählte Verbname "Get" ist. (Fast jede Art von Cmdlet, das Informationen abrufen kann, kann Befehlszeileneingaben verarbeiten.) Weitere Informationen zu genehmigten Cmdlet-Verben finden Sie unter Cmdlet-Verbnamen.

Im Folgenden finden Sie die Definition für dieses Get-Proc Cmdlet. Details zu dieser Definition finden Sie unter Erstellen Ihres ersten Cmdlets.

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

Definieren der Eingabe aus der Pipeline

In diesem Abschnitt wird beschrieben, wie Eingaben aus der Pipeline für ein Cmdlet definiert werden. Dieses Get-Proc-Cmdlet definiert eine Eigenschaft, die den Parameter darstellt, wie unter Hinzufügen von Parametern zum Name Verarbeiten der Befehlszeileneingabe beschrieben. (Allgemeine Informationen zum Deklarieren von Parametern finden Sie in diesem Thema.)

Wenn ein Cmdlet jedoch Pipelineeingaben verarbeiten muss, muss es seine Parameter an Eingabewerte durch die Windows PowerShell gebunden haben. Hierzu müssen Sie das Schlüsselwort oder das Schlüsselwort der ValueFromPipeline ValueFromPipelineByProperty Attributdeklaration System.Management.Automation.Parameterattribute hinzufügen. Geben Sie das ValueFromPipeline Schlüsselwort an, wenn das Cmdlet auf das vollständige Eingabeobjekt zusteuert. Geben Sie ValueFromPipelineByProperty an, wenn das Cmdlet nur auf eine Eigenschaft des Objekts zusteuert.

Dies ist die Parameterdeklaration für den Name Parameter dieses Get-Proc Cmdlets, das Pipelineeingaben akzeptiert.

[Parameter(
   Position = 0,
   ValueFromPipeline = true,
   ValueFromPipelineByPropertyName = true)]
[ValidateNotNullOrEmpty]
public string[] Name
{
   get { return this.processNames; }
   set { this.processNames = value; }
}
<Parameter(Position:=0, ValueFromPipeline:=True, _
ValueFromPipelineByPropertyName:=True), ValidateNotNullOrEmpty()> _
Public Property Name() As String()
    Get
        Return processNames
    End Get

    Set(ByVal value As String())
        processNames = value
    End Set

End Property

Die vorherige Deklaration legt das -Schlüsselwort auf fest, sodass die Windows PowerShell-Runtime den Parameter an das eingehende Objekt bindet, wenn das Objekt denselben Typ wie der Parameter auft, oder wenn es in denselben Typ umerciert werden ValueFromPipeline true kann. Das ValueFromPipelineByPropertyName -Schlüsselwort wird auch auf true festgelegt, damit die Windows PowerShell Runtime das eingehende Objekt auf eine Eigenschaft Name überprüft. Wenn das eingehende Objekt über eine solche Eigenschaft verfügt, bindet die Laufzeit den Parameter an die -Eigenschaft Name Name des eingehenden Objekts.

Hinweis

Die Einstellung des ValueFromPipeline Attributschlüsselworts für einen Parameter hat Vorrang vor der Einstellung für das ValueFromPipelineByPropertyName Schlüsselwort.

Überschreiben einer Eingabeverarbeitungsmethode

Wenn Ihr Cmdlet Pipelineeingaben verarbeiten soll, muss es die entsprechenden Eingabeverarbeitungsmethoden überschreiben. Die grundlegenden Eingabeverarbeitungsmethoden werden in Creating Your First Cmdlet (Erstellen des ersten Cmdlets) eingeführt.

Dieses Get-Proc-Cmdlet überschreibt die System.Management.Automation.Cmdlet.ProcessRecord-Methode, um die vom Benutzer oder einem Skript bereitgestellte Name Parametereingabe zu verarbeiten. Diese Methode gibt die Prozesse für jeden angeforderten Prozessnamen oder alle Prozesse zurück, wenn kein Name angegeben wird. Beachten Sie, dass in System.Management.Automation.Cmdlet.ProcessRecordder Aufruf von WriteObject(System.Object,System.Boolean) der Ausgabemechanismus zum Senden von Ausgabeobjekten an die Pipeline ist. Der zweite Parameter dieses Aufrufs, , wird auf festgelegt, um die Windows PowerShell-Runtime angibt, das Array von Prozessobjekten zu aufzählen und einen Prozess nach dem anderen in die Befehlszeile zu enumerateCollection true schreiben.

protected override void ProcessRecord()
{
  // If no process names are passed to the cmdlet, get all processes.
  if (processNames == null)
  {
      // Write the processes to the pipeline making them available
      // to the next cmdlet. The second argument of this call tells
      // PowerShell to enumerate the array, and send one process at a
      // time to the pipeline.
      WriteObject(Process.GetProcesses(), true);
  }
  else
  {
    // If process names are passed to the cmdlet, get and write
    // the associated processes.
    foreach (string name in processNames)
    {
      WriteObject(Process.GetProcessesByName(name), true);
    } // End foreach (string name...).
  }
}
Protected Overrides Sub ProcessRecord()
    Dim processes As Process()

    '/ If no process names are passed to the cmdlet, get all processes.
    If processNames Is Nothing Then
        processes = Process.GetProcesses()
    Else

        '/ If process names are specified, write the processes to the
        '/ pipeline to display them or make them available to the next cmdlet.
        For Each name As String In processNames
            '/ The second parameter of this call tells PowerShell to enumerate the
            '/ array, and send one process at a time to the pipeline.
            WriteObject(Process.GetProcessesByName(name), True)
        Next
    End If

End Sub 'ProcessRecord

Codebeispiel

Den vollständigen C#-Beispielcode finden Sie unter GetProcessSample03-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 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 muss es über ein Windows PowerShell über ein Windows PowerShell-Snap-In registriert werden. 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, testen Sie es, indem Sie es in der Befehlszeile ausführen. Testen Sie beispielsweise den Code für das Beispiel-Cmdlet. Weitere Informationen zur Verwendung von Cmdlets über die Befehlszeile finden Sie unter Erste Schritte mit Windows PowerShell.

  • Geben Sie Windows PowerShell Eingabeaufforderung die folgenden Befehle ein, um die Prozessnamen über die Pipeline abzurufen.

    PS> type ProcessNames | get-proc
    

    Die folgende Ausgabe wird angezeigt.

    Handles  NPM(K)  PM(K)   WS(K)  VS(M)  CPU(s)    Id  ProcessName
    -------  ------  -----   ----- -----   ------    --  -----------
        809      21  40856    4448    147    9.50  2288  iexplore
        737      21  26036   16348    144   22.03  3860  iexplore
         39       2   1024     388     30    0.08  3396  notepad
       3927      62  71836   26984    467  195.19  1848  OUTLOOK
    
  • Geben Sie die folgenden Zeilen ein, um die Prozessobjekte mit einer Eigenschaft aus den Prozessen Name namens "IEXPLORE" zu erhalten. In diesem Beispiel wird das Cmdlet (bereitgestellt von Windows PowerShell) als Upstreambefehl verwendet, um Get-Process die "IEXPLORE"-Prozesse abzurufen.

    PS> get-process iexplore | get-proc
    

    Die folgende Ausgabe wird angezeigt.

    Handles  NPM(K)  PM(K)   WS(K)  VS(M)  CPU(s)    Id  ProcessName
    -------  ------  -----   ----- -----   ------    --  -----------
        801      21  40720    6544    142    9.52  2288  iexplore
        726      21  25872   16652    138   22.09  3860  iexplore
        801      21  40720    6544    142    9.52  2288  iexplore
        726      21  25872   16652    138   22.09  3860  iexplore
    

Weitere Informationen

Hinzufügen von Parametern zum Verarbeiten der Befehlszeileneingabe

Erstellen Ihres ersten Cmdlets

Erweitern von Objekttypen und Formatierung

Registrieren von Cmdlets, Anbietern und Hostanwendungen

Windows PowerShell-Referenz

Cmdlet-Beispiele