Lägga till parametrar som bearbetar pipelineindata

En indatakälla för en cmdlet är ett objekt i pipelinen som kommer från en överordnad cmdlet. I det här avsnittet beskrivs hur du lägger till en parameter i Get-Proc-cmdleten (beskrivs i Skapa din första cmdlet ) så att cmdletenkan bearbeta pipelineobjekt.

Den Get-Proc cmdleten använder en parameter som accepterar indata från ett pipelineobjekt, hämtar processinformation från den lokala datorn baserat på de angivna namnen och visar sedan information om processerna på Name kommandoraden.

Definiera cmdlet-klassen

Det första steget i att skapa cmdleten är att alltid namnge cmdleten och deklarera den .NET-klass som implementerar cmdleten . Den här cmdleten hämtar processinformation, så verbnamnet som väljs här är "Get". (Nästan alla slags cmdlet som kan hämta information kan bearbeta kommandoradsindata.) Mer information om godkända cmdlet-verb finns i Cmdlet verbnamn.

Följande är definitionen för den här Get-Proc cmdleten. Information om den här definitionen finns i Skapa din första cmdlet.

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

Definiera indata från pipelinen

I det här avsnittet beskrivs hur du definierar indata från pipelinen för en cmdlet. Den Get-Proc cmdleten definierar en egenskap som representerar parametern enligt beskrivningen Name i Adding Parameters that Process Command Line Input. (Se avsnittet för allmän information om att deklarera parametrar.)

Men när en cmdlet behöver bearbeta pipelineindata måste den ha parametrar som är bundna till indatavärden av Windows PowerShell-körningen. Om du vill göra detta måste du lägga till nyckelordet eller lägga till nyckelordet i attributdeklarationen ValueFromPipeline ValueFromPipelineByProperty System.Management.Automation.Parameterattribute. Ange ValueFromPipeline nyckelordet om cmdleten kommer åt hela indataobjektet. Ange ValueFromPipelineByProperty om cmdleten endast kommer åt en egenskap för objektet.

Här är parameterdeklarationen för parametern för Name den här Get-Proc cmdlet som accepterar pipelineindata.

[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

Föregående deklaration anger nyckelordet till så att Windows PowerShell-körningen binder parametern till det inkommande objektet om objektet är av samma typ som parametern, eller om det kan vara ValueFromPipeline true coerced till samma typ. Nyckelordet ValueFromPipelineByPropertyName är också inställt true på så att Windows PowerShell körtid kontrollerar inkommande objekt för en Name egenskap. Om det inkommande objektet har en sådan egenskap binder körningen Name parametern till egenskapen Name för det inkommande objektet.

Anteckning

Inställningen för ValueFromPipeline attributnyckelordet för en parameter har företräde framför inställningen för ValueFromPipelineByPropertyName nyckelordet .

Åsidosätta en metod för indatabearbetning

Om din cmdlet ska hantera pipelineindata måste den åsidosätta lämpliga metoder för bearbetning av indata. De grundläggande indatabearbetningsmetoderna introduceras i Skapa din första cmdlet.

Den Get-Proc cmdleten åsidosätter metoden System.Management.Automation.Cmdlet.ProcessRecord för att hantera de parameterindata som anges av användaren Name eller ett skript. Den här metoden hämtar processerna för varje begärt processnamn eller alla processer om inget namn anges. Observera att i System.Management.Automation.Cmdlet.ProcessRecordär anropet till WriteObject(System.Object,System.Boolean) utdatamekanismen för att skicka utdataobjekt till pipelinen. Den andra parametern i det här anropet, , är inställd på för att ange att Windows PowerShell-körningen ska räkna upp matrisen med processobjekt och skriva en process i taget till enumerateCollection true kommandoraden.

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

Kodexempel

Den fullständiga C#-exempelkoden finns i GetProcessSample03 Sample.

Definiera objekttyper och formatering

Windows PowerShell skickar information mellan cmdlets med hjälp av .Net-objekt. Därför kan en cmdlet behöva definiera sin egen typ, eller så kan cmdleten behöva utöka en befintlig typ som tillhandahålls av en annan cmdlet. Mer information om hur du definierar nya typer eller utökar befintliga typer finns i Utöka objekttyper och formatering.

Skapa cmdleten

När du har implementerat en cmdlet måste den registreras Windows PowerShell via en Windows PowerShell snapin-modulen. Mer information om hur du registrerar cmdlets finns i How to Register Cmdlets, Providers, and Host Applications.

Testa cmdleten

När din cmdlet har registrerats med Windows PowerShell kan du testa den genom att köra den på kommandoraden. Testa till exempel koden för exempel-cmdleten. Mer information om hur du använder cmdlets från kommandoraden finns i Komma igång med Windows PowerShell.

  • I kommandotolken Windows PowerShell du följande kommandon för att hämta processnamnen via pipelinen.

    PS> type ProcessNames | get-proc
    

    Följande utdata visas.

    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
    
  • Ange följande rader för att hämta processobjekten som har en Name egenskap från processerna som kallas "IEXPLORE". I det här exemplet används cmdleten (som tillhandahålls av Windows PowerShell) som ett uppströmskommando för att hämta Get-Process "IEXPLORE"-processerna.

    PS> get-process iexplore | get-proc
    

    Följande utdata visas.

    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
    

Se även

Lägga till parametrar som bearbetar kommandoradsinmatning

Skapa din första cmdlet

Utöka objekttyper och formatering

Registrera cmdlets, providers och värdprogram

Windows PowerShell-referens

Cmdlet-exempel