Delen via


Parameters toevoegen die pijplijninvoer verwerken

Een bron van invoer voor een cmdlet is een object in de pijplijn die afkomstig is van een upstream-cmdlet. In deze sectie wordt beschreven hoe u een parameter toevoegt aan de Get-Proc-cmdlet (beschreven in Uw eerste cmdlet maken) zodat de cmdlet pijplijnobjecten kan verwerken.

Deze Get-Proc cmdlet maakt gebruik van een Name parameter die invoer van een pijplijnobject accepteert, procesgegevens ophaalt van de lokale computer op basis van de opgegeven namen en vervolgens informatie weergeeft over de processen op de opdrachtregel.

De cmdlet-klasse definiëren

De eerste stap bij het maken van de cmdlet is altijd de naamgeving van de cmdlet en het declareren van de .NET-klasse die de cmdlet implementeert. Deze cmdlet haalt procesgegevens op, dus de werkwoordnaam die hier is gekozen, is 'Get'. (Bijna elk type cmdlet waarmee informatie kan worden opgehaald, kan opdrachtregelinvoer verwerken.) Zie Cmdlet Verb Namesvoor meer informatie over goedgekeurde cmdlet-werkwoorden.

Hier volgt de definitie voor deze Get-Proc cmdlet. Details van deze definitie worden gegeven in Uw eerste cmdlet maken.

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

Invoer definiëren vanuit de pijplijn

In deze sectie wordt beschreven hoe u invoer definieert uit de pijplijn voor een cmdlet. Met deze Get-Proc cmdlet wordt een eigenschap gedefinieerd die de parameter Name vertegenwoordigt, zoals beschreven in Parameters toevoegen die opdrachtregelinvoer verwerken. (Zie dit onderwerp voor algemene informatie over het declareren van parameters.)

Wanneer een cmdlet echter pijplijninvoer moet verwerken, moeten de parameters zijn gebonden aan invoerwaarden door de Windows PowerShell-runtime. Hiervoor moet u het ValueFromPipeline trefwoord toevoegen of het ValueFromPipelineByProperty trefwoord toevoegen aan de declaratie System.Management.Automation.ParameterAttribute. Geef het ValueFromPipeline trefwoord op als de cmdlet toegang heeft tot het volledige invoerobject. Geef de ValueFromPipelineByProperty op als de cmdlet alleen toegang heeft tot een eigenschap van het object.

Hier volgt de parameterdeclaratie voor de Name parameter van deze Get-Proc cmdlet die pijplijninvoer accepteert.

[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

Met de vorige declaratie wordt het ValueFromPipeline trefwoord ingesteld op true, zodat de Windows PowerShell-runtime de parameter verbindt met het binnenkomende object als het object hetzelfde type is als de parameter, of als het kan worden verplicht tot hetzelfde type. Het trefwoord ValueFromPipelineByPropertyName is ook ingesteld op true, zodat de Windows PowerShell-runtime het binnenkomende object controleert op een Name eigenschap. Als het binnenkomende object een dergelijke eigenschap heeft, verbindt de runtime de parameter Name met de eigenschap Name van het binnenkomende object.

Notitie

De instelling van het ValueFromPipeline kenmerkwoord voor een parameter heeft voorrang op de instelling voor het ValueFromPipelineByPropertyName trefwoord.

Een invoerverwerkingsmethode overschrijven

Als uw cmdlet pijplijninvoer moet verwerken, moet deze de juiste invoerverwerkingsmethoden overschrijven. De basismethoden voor invoerverwerking worden geïntroduceerd in Uw eerste cmdlet maken.

Deze Get-Proc cmdlet overschrijft de methode System.Management.Automation.Cmdlet.ProcessRecord om de Name parameterinvoer van de gebruiker of een script af te handelen. Met deze methode worden de processen voor elke aangevraagde procesnaam of alle processen opgevraagd als er geen naam is opgegeven. U ziet dat in System.Management.Automation.Cmdlet.ProcessRecordde aanroep naar WriteObject(System.Object,System.Boolean) het uitvoermechanisme is voor het verzenden van uitvoerobjecten naar de pijplijn. De tweede parameter van deze aanroep, enumerateCollection, is ingesteld op true om de Windows PowerShell-runtime de matrix van procesobjecten te inventariseren en één proces tegelijk naar de opdrachtregel te schrijven.

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

Codevoorbeeld

Zie GetProcessSample03 Samplevoor de volledige C#-voorbeeldcode.

Objecttypen en -opmaak definiëren

Windows PowerShell geeft informatie door tussen cmdlets met behulp van .NET-objecten. Daarom moet een cmdlet mogelijk een eigen type definiëren of moet de cmdlet mogelijk een bestaand type uitbreiden dat wordt geleverd door een andere cmdlet. Zie Objecttypen en Opmaak uitbreidenvoor meer informatie over het definiëren van nieuwe typen of het uitbreiden van bestaande typen.

De cmdlet bouwen

Nadat u een cmdlet hebt geïmplementeerd, moet deze zijn geregistreerd bij Windows PowerShell via een Windows PowerShell-module. Zie Cmdlets, providers en hosttoepassingen registrerenvoor meer informatie over het registreren van cmdlets.

De cmdlet testen

Wanneer uw cmdlet is geregistreerd bij Windows PowerShell, test u deze door deze uit te voeren op de opdrachtregel. Test bijvoorbeeld de code voor de voorbeeld-cmdlet. Zie de Aan de slag met Windows PowerShellvoor meer informatie over het gebruik van cmdlets vanaf de opdrachtregel.

  • Voer bij de Windows PowerShell-prompt de volgende opdrachten in om de procesnamen via de pijplijn op te halen.

    PS> type ProcessNames | Get-Proc
    

    De volgende uitvoer wordt weergegeven.

    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
    
  • Voer de volgende regels in om de procesobjecten met een Name eigenschap op te halen uit de processen met de naam IEXPLORE. In dit voorbeeld wordt de Get-Process-cmdlet (geleverd door Windows PowerShell) gebruikt als een upstream-opdracht om de 'IEXPLORE'-processen op te halen.

    PS> Get-Process iexplore | Get-Proc
    

    De volgende uitvoer wordt weergegeven.

    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
    

Zie ook

Parameters toevoegen die opdrachtregelinvoer verwerken

uw eerste cmdlet maken

objecttypen en opmaak uitbreiden

Cmdlets, providers en hosttoepassingen registreren

Windows PowerShell-referentie

cmdlet-voorbeelden