Compartilhar via


Adicionar parâmetros que processam a entrada de pipeline

Uma fonte de entrada para um cmdlet é um objeto no pipeline que se origina de um cmdlet upstream. Esta seção descreve como adicionar um parâmetro ao cmdlet Get-Proc (descrito em Criando seu primeiro cmdlet) para que o cmdlet possa processar objetos de pipeline.

Esse cmdlet Get-Proc usa um parâmetro Name que aceita a entrada de um objeto de pipeline, recupera informações de processo do computador local com base nos nomes fornecidos e exibe informações sobre os processos na linha de comando.

Definindo a classe cmdlet

A primeira etapa na criação do cmdlet é sempre nomear o cmdlet e declarar a classe .NET que implementa o cmdlet. Esse cmdlet recupera informações do processo, portanto, o nome do verbo escolhido aqui é "Obter". (Quase qualquer tipo de cmdlet capaz de recuperar informações pode processar entrada de linha de comando.) Para obter mais informações sobre verbos de cmdlet aprovados, consulte Nomes de Verbo do Cmdlet.

Veja a seguir a definição deste cmdlet Get-Proc. Os detalhes dessa definição são dados em Criando seu primeiro cmdlet.

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

Definindo a entrada do pipeline

Esta seção descreve como definir a entrada do pipeline para um cmdlet. Esse cmdlet Get-Proc define uma propriedade que representa o parâmetro Name, conforme descrito em Adicionando parâmetros que processamde entrada de linha de comando. (Consulte esse tópico para obter informações gerais sobre como declarar parâmetros.)

No entanto, quando um cmdlet precisa processar a entrada do pipeline, ele deve ter seus parâmetros associados aos valores de entrada pelo runtime do Windows PowerShell. Para fazer isso, você deve adicionar a palavra-chave ValueFromPipeline ou adicionar a palavra-chave ValueFromPipelineByProperty à declaração de atributo System.Management.Automation.ParameterAttribute. Especifique a palavra-chave ValueFromPipeline se o cmdlet acessar o objeto de entrada completo. Especifique o ValueFromPipelineByProperty se o cmdlet acessar apenas uma propriedade do objeto.

Aqui está a declaração de parâmetro para o parâmetro Name deste cmdlet Get-Proc que aceita entrada de 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

A declaração anterior define a palavra-chave ValueFromPipeline como true para que o runtime do Windows PowerShell associe o parâmetro ao objeto de entrada se o objeto for do mesmo tipo que o parâmetro ou se ele puder ser coagido ao mesmo tipo. A palavra-chave ValueFromPipelineByPropertyName também é definida como true para que o runtime do Windows PowerShell verifique se o objeto de entrada está Name propriedade. Se o objeto de entrada tiver essa propriedade, o runtime associará o parâmetro Name à propriedade Name do objeto de entrada.

Observação

A configuração da palavra-chave de atributo ValueFromPipeline para um parâmetro tem precedência sobre a configuração da palavra-chave ValueFromPipelineByPropertyName.

Substituindo um método de processamento de entrada

Se o cmdlet for para lidar com a entrada do pipeline, ele precisará substituir os métodos de processamento de entrada apropriados. Os métodos básicos de processamento de entrada são introduzidos em Criando seu primeiro cmdlet.

Esse cmdlet Get-Proc substitui o método System.Management.Automation.Cmdlet.ProcessRecord para lidar com a entrada de parâmetro Name fornecida pelo usuário ou um script. Esse método obterá os processos para cada nome de processo solicitado ou todos os processos se nenhum nome for fornecido. Observe que, em System.Management.Automation.Cmdlet.ProcessRecord, a chamada para WriteObject(System.Object,System.Boolean) é o mecanismo de saída para enviar objetos de saída para o pipeline. O segundo parâmetro dessa chamada, enumerateCollection, é definido como true para informar ao runtime do Windows PowerShell para enumerar a matriz de objetos de processo e gravar um processo de cada vez na linha de 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

Exemplo de código

Para obter o código de exemplo em C# completo, consulte de exemplo GetProcessSample03.

Definindo tipos de objeto e formatação

O Windows PowerShell passa informações entre cmdlets usando objetos .NET. Consequentemente, um cmdlet pode precisar definir seu próprio tipo ou o cmdlet pode precisar estender um tipo existente fornecido por outro cmdlet. Para obter mais informações sobre como definir novos tipos ou estender tipos existentes, consulte Estendendo tipos de objeto e formatação.

Compilando o cmdlet

Depois de implementar um cmdlet, ele deve ser registrado no Windows PowerShell por meio de um snap-in do Windows PowerShell. Para obter mais informações sobre como registrar cmdlets, consulte Como registrar cmdlets, provedores e aplicativos host.

Testando o cmdlet

Quando o cmdlet tiver sido registrado no Windows PowerShell, teste-o executando-o na linha de comando. Por exemplo, teste o código para o cmdlet de exemplo. Para obter mais informações sobre como usar cmdlets da linha de comando, consulte o Introdução ao Windows PowerShell.

  • No prompt do Windows PowerShell, insira os comandos a seguir para recuperar os nomes de processo por meio do pipeline.

    PS> type ProcessNames | Get-Proc
    

    A saída a seguir é exibida.

    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
    
  • Insira as linhas a seguir para obter os objetos de processo que têm uma propriedade Name dos processos chamados "IEXPLORE". Este exemplo usa o cmdlet Get-Process (fornecido pelo Windows PowerShell) como um comando upstream para recuperar os processos "IEXPLORE".

    PS> Get-Process iexplore | Get-Proc
    

    A saída a seguir é exibida.

    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
    

Consulte Também

a adição de parâmetros que processam de entrada de linha de comando

criando seu primeiro cmdlet

estendendo tipos de objeto e formatação

como registrar cmdlets, provedores e aplicativos host

de referência do Windows PowerShell

exemplos de cmdlet