Aggiunta di parametri che elaborano gli input della pipeline

Un'origine di input per un cmdlet è un oggetto nella pipeline che ha origine da un cmdlet upstream. Questa sezione descrive come aggiungere un parametro al cmdlet Get-Proc (descritto in Creazionedel primo cmdlet ) in modo che il cmdlet possa elaborare oggetti pipeline.

Questo cmdlet Get-Proc usa un parametro che accetta l'input da un oggetto pipeline, recupera le informazioni sul processo dal computer locale in base ai nomi forniti e quindi visualizza le informazioni sui processi nella riga di Name comando.

Definizione della classe cmdlet

Il primo passaggio nella creazione del cmdlet consiste sempre nel denominare il cmdlet e dichiarare la classe .NET che implementa il cmdlet. Questo cmdlet recupera le informazioni sul processo, quindi il nome del verbo scelto qui è "Get". Quasi tutti i cmdlet in grado di recuperare informazioni possono elaborare l'input della riga di comando. Per altre informazioni sui verbi dei cmdlet approvati, vedere Nomi dei verbi dei cmdlet.

Di seguito è riportata la definizione per questo cmdlet Get-Proc. I dettagli di questa definizione sono disponibili in Creazione del primo cmdlet.

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

Definizione dell'input dalla pipeline

Questa sezione descrive come definire l'input dalla pipeline per un cmdlet. Questo Get-Proc cmdlet definisce una proprietà che rappresenta il parametro come descritto Name in Aggiunta di parametri che elaborano l'input della riga di comando. Per informazioni generali sulla dichiarazione dei parametri, vedere questo argomento.

Tuttavia, quando un cmdlet deve elaborare l'input della pipeline, i relativi parametri devono essere associati ai valori di input dal runtime Windows PowerShell runtime. A tale scopo, è necessario aggiungere la parola chiave o aggiungere la parola chiave alla dichiarazione dell'attributo ValueFromPipeline ValueFromPipelineByProperty System.Management.Automation.Parameterattribute. Specificare la ValueFromPipeline parola chiave se il cmdlet accede all'oggetto di input completo. Specificare se ValueFromPipelineByProperty il cmdlet accede solo a una proprietà dell'oggetto .

Ecco la dichiarazione di parametro per il Name parametro di questo cmdlet Get-Proc che accetta l'input della pipeline.

[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

La dichiarazione precedente imposta la parola chiave su in modo che il runtime di Windows PowerShell associa il parametro all'oggetto in ingresso se l'oggetto è dello stesso tipo del parametro o se può essere forzato allo ValueFromPipeline true stesso tipo. La parola chiave è anche impostata su in modo che il ValueFromPipelineByPropertyName true runtime Windows PowerShell controlli l'oggetto in ingresso per una Name proprietà. Se l'oggetto in ingresso ha una proprietà di questo tipo, il runtime associa il Name parametro alla Name proprietà dell'oggetto in ingresso.

Nota

L'impostazione della parola ValueFromPipeline chiave attribute per un parametro ha la precedenza sull'impostazione per la parola chiave ValueFromPipelineByPropertyName .

Override di un metodo di elaborazione di input

Se il cmdlet deve gestire l'input della pipeline, deve eseguire l'override dei metodi di elaborazione dell'input appropriati. I metodi di elaborazione di input di base sono stati introdotti in Creazione del primo cmdlet.

Questo cmdlet Get-Proc esegue l'override del metodo System.Management.Automation.Cmdlet.ProcessRecord per gestire l'input del parametro fornito dall'utente Name o da uno script. Questo metodo otterrà i processi per ogni nome di processo richiesto o per tutti i processi se non viene specificato alcun nome. Si noti che all'interno di System.Management.Automation.Cmdlet.ProcessRecordla chiamata a WriteObject(System.Object,System.Boolean) è il meccanismo di output per l'invio di oggetti di output alla pipeline. Il secondo parametro di questa chiamata, , è impostato su per indicare al runtime di Windows PowerShell di enumerare la matrice di oggetti processo e scrivere un processo alla enumerateCollection volta nella riga di true comando.

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

Codice di esempio

Per il codice di esempio C# completo, vedere Esempio GetProcessSample03.

Definizione di tipi di oggetto e formattazione

Windows PowerShell passa informazioni tra i cmdlet usando oggetti .NET. Di conseguenza, un cmdlet potrebbe dover definire il proprio tipo oppure potrebbe essere necessario estendere un tipo esistente fornito da un altro cmdlet. Per altre informazioni sulla definizione di nuovi tipi o sull'estensione di tipi esistenti, vedere Estensione di tipi di oggetto e formattazione.

Compilazione del cmdlet

Dopo l'implementazione, un cmdlet deve essere registrato con Windows PowerShell tramite uno snap-in Windows PowerShell di configurazione. Per altre informazioni sulla registrazione dei cmdlet, vedere Come registrare cmdlet, provider e applicazioni host.

Test del cmdlet

Dopo aver registrato il cmdlet con Windows PowerShell, testarlo eseguendolo nella riga di comando. Ad esempio, testare il codice per il cmdlet di esempio. Per altre informazioni sull'uso dei cmdlet dalla riga di comando, vedere l'Attività iniziali con Windows PowerShell.

  • Al prompt Windows PowerShell immettere i comandi seguenti per recuperare i nomi dei processi tramite la pipeline.

    PS> type ProcessNames | get-proc
    

    Viene visualizzato l'output seguente.

    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
    
  • Immettere le righe seguenti per ottenere gli oggetti processo con una Name proprietà dai processi denominati "IEXPLORE". Questo esempio usa il cmdlet (fornito da Windows PowerShell) come comando upstream per recuperare i processi Get-Process "IEXPLORE".

    PS> get-process iexplore | get-proc
    

    Viene visualizzato l'output seguente.

    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
    

Vedere anche

Aggiunta di parametri che elaborano l'input della riga di comando

Creazione del primo cmdlet

Estensione di tipi di oggetto e formattazione

Come registrare cmdlet, provider e applicazioni host

Guida di riferimento di Windows PowerShell

Esempi di cmdlet