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 in Creating Your First Cmdlet) einen Parameter hinzufügen, damit das Cmdlet Pipelineobjekte verarbeiten kann.

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

Definieren der Cmdlet-Klasse

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

Es folgt die Definition für dieses Get-Proc-Cmdlet. Details zu dieser Definition werden in Creating Your First Cmdletangegeben.

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

Definieren von Eingaben aus der Pipeline

In diesem Abschnitt wird beschrieben, wie Sie Eingaben aus der Pipeline für ein Cmdlet definieren. Dieses Get-Proc-Cmdlet definiert eine Eigenschaft, die den Name Parameter darstellt, wie in Hinzufügen von Parametern, die die Befehlszeileneingabe verarbeiten,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-Laufzeit gebunden haben. Hierzu müssen Sie das schlüsselwort ValueFromPipeline hinzufügen oder das ValueFromPipelineByProperty Schlüsselwort zur System.Management.Automation.ParameterAttribute Attributdeklaration hinzufügen. Geben Sie das schlüsselwort ValueFromPipeline an, wenn das Cmdlet auf das vollständige Eingabeobjekt zugreift. Geben Sie die ValueFromPipelineByProperty an, wenn das Cmdlet nur auf eine Eigenschaft des Objekts zugreift.

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 ValueFromPipeline auf true fest, sodass die Windows PowerShell-Laufzeit den Parameter an das eingehende Objekt bindet, wenn das Objekt derselbe Typ wie der Parameter ist oder wenn es mit demselben Typ umgewandelt werden kann. Das schlüsselwort ValueFromPipelineByPropertyName ist auch auf true festgelegt, sodass die Windows PowerShell-Runtime das eingehende Objekt auf eine Name-Eigenschaft überprüft. Wenn das eingehende Objekt eine solche Eigenschaft aufweist, bindet die Laufzeit den Name Parameter an die Name Eigenschaft des eingehenden Objekts.

Hinweis

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

Überschreiben einer Eingabeverarbeitungsmethode

Wenn Ihr Cmdlet die Pipelineeingabe verarbeitet, muss es die entsprechenden Eingabeverarbeitungsmethoden überschreiben. Die grundlegenden Eingabeverarbeitungsmethoden werden in Creating Your First Cmdleteingeführt.

Mit diesem Get-Proc cmdlet wird die System.Management.Automation.Cmdlet.ProcessRecord Methode außer Kraft gesetzt, um die vom Benutzer oder einem Skript bereitgestellte Name Parametereingabe zu verarbeiten. Diese Methode ruft die Prozesse für jeden angeforderten Prozessnamen oder alle Prozesse ab, 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, enumerateCollection, ist auf true festgelegt, um die Windows PowerShell-Runtime anweisen, das Array von Prozessobjekten aufgezählt und einen Prozess gleichzeitig in die Befehlszeile zu 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 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 muss es über ein Windows PowerShell-Snap-In bei Windows PowerShell 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 registriert 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 in der Erste Schritte mit Windows PowerShell.

  • Geben Sie an der 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 abzurufen, die über eine Name Eigenschaft aus den Prozessen namens "IEXPLORE" verfügen. In diesem Beispiel wird das cmdlet Get-Process (bereitgestellt von Windows PowerShell) als upstream-Befehl verwendet, um 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
    

Siehe auch

Hinzufügen von Parametern, die befehlszeileneingaben

Erstellen Ihres ersten Cmdlets

Erweitern von Objekttypen und Formatierungen

Registrieren von Cmdlets, Anbietern und Hostanwendungen

Windows PowerShell-Referenz-

Cmdlet-Beispiele