Dela via


Lägga till parametrar som bearbetar pipelineindata

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

Den här Get-Proc-cmdleten använder en Name 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å kommandoraden.

Definiera cmdlet-klassen

Det första steget när cmdleten skapas är att alltid namnge cmdleten och deklarera .NET-klassen som implementerar cmdleten. Den här cmdleten hämtar processinformation, så verbnamnet som väljs här är "Get". (Nästan alla typer av cmdletar 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 här Get-Proc-cmdleten definierar en egenskap som representerar parametern Name enligt beskrivningen i Lägga till parametrar som bearbetar kommandoradsindata. (Se det avsnittet för allmän information om att deklarera parametrar.)

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

Här är parameterdeklarationen för parametern Name för den här Get-Proc cmdleten 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

I föregående deklaration anges nyckelordet ValueFromPipeline till true så att Windows PowerShell-körningen binder parametern till det inkommande objektet om objektet är av samma typ som parametern eller om det kan tvingas till samma typ. Nyckelordet ValueFromPipelineByPropertyName är också inställt på true så att Windows PowerShell-körningen kontrollerar det inkommande objektet efter 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.

Anmärkning

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

Åsidosätta en indatabearbetningsmetod

Om cmdleten ska hantera pipelineindata måste den åsidosätta lämpliga indatabearbetningsmetoder. De grundläggande metoderna för indatabearbetning introduceras i Skapa din första cmdlet.

Den här Get-Proc-cmdleten åsidosätter metoden System.Management.Automation.Cmdlet.ProcessRecord för att hantera Name parameterindata som tillhandahålls av användaren 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 för det här anropet, enumerateCollection, är inställd på true för att tala om för Windows PowerShell-körningen att räkna upp matrisen med processobjekt och skriva en process i taget till 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 cmdletar 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 med Windows PowerShell via en Windows PowerShell-snapin-modul. Mer information om hur du registrerar cmdletar finns i Så här registrerar du cmdletar, leverantörer och värdprogram.

Testa cmdleten

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

  • I Windows PowerShell-prompten anger 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 Get-Process (tillhandahålls av Windows PowerShell) som ett uppströmskommando för att hämta "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 kommandoradsindata

Skapa din första cmdlet

utöka objekttyper och formatering

Registrera cmdletar, leverantörer och värdprogram

Windows PowerShell-referens

Cmdlet-exempel