Parameters toevoegen die pijplijninvoer verwerken

Een invoerbron voor een cmdlet is een object in de pijplijn dat 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 cmdletpijplijnobjecten kan verwerken.

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

De cmdlet-klasse definiëren

De eerste stap bij het maken van de cmdlet is het altijd benoemen van de cmdlet en het declareren van de .NET-klasse die de cmdlet implementeert. Met deze cmdlet worden procesgegevens opgehaald, dus de hier gekozen werkwoordnaam is 'Get'. (Bijna elk soort cmdlet waarmee informatie kan worden opgehaald, kan opdrachtregelinvoer verwerken.) Zie cmdlet werkwoordnamen voor meer informatie over goedgekeurde cmdlet-woorden.

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 van de pijplijn voor een cmdlet definieert. Deze Get-Proc cmdlet definieert een eigenschap die de parameter vertegenwoordigt, zoals beschreven in Parameters toevoegen Name die opdrachtregelinvoer verwerken. (Zie dit onderwerp voor algemene informatie over het declareren van parameters.)

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

Hier is de parameterdeclaratie voor Name de parameter van 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 trefwoord zo dat ValueFromPipeline 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 geseed tot true hetzelfde type. Het ValueFromPipelineByPropertyName trefwoord is ook ingesteld true op zodat de Windows PowerShell runtime het binnenkomende object op een eigenschap Name controleert. Als het binnenkomende object een dergelijke eigenschap heeft, verbindt de runtime de Name parameter met de eigenschap van het Name binnenkomende object.

Notitie

De instelling van het ValueFromPipeline trefwoord kenmerk 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 zijn geïntroduceerd in Uw eerste cmdlet maken.

Met Get-Proc cmdlet wordt de methode System.Management.Automation.Cmdlet.ProcessRecord overgeslagen om de parameterinvoer van de gebruiker of een Name script te verwerken. 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 van WriteObject(System.Object,System.Boolean) het uitvoermechanisme is voor het verzenden van uitvoerobjecten naar de pijplijn. De tweede parameter van deze aanroep, , is zo ingesteld dat de enumerateCollection Windows PowerShell-runtime de matrix met procesobjecten moet opsnoemen en één proces tegelijk naar de opdrachtregel moet true 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 tussen cmdlets door 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 Extending Object Types and Formatting (Objecttypen uitbreiden en formatteren) voor meer informatie over het definiëren van nieuwe typen of het uitbreiden van bestaande typen.

De cmdlet bouwen

Na het implementeren van een cmdlet moet deze worden geregistreerd bij Windows PowerShell via Windows PowerShell-module. Zie How to Register Cmdlets, Providers, and Host Applications (Cmdlets,providers en hosttoepassingen registreren) voor 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 voor meer informatie over het gebruik van cmdlets vanaf de opdrachtregel de Aan de slag met Windows PowerShell.

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

Naslaginformatie over Windows PowerShell

Cmdlet-voorbeelden