Partilhar via


Adding Parameters that Process Pipeline Input (Adicionar Parâmetros que Processam Entradas 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.

Este cmdlet Get-Proc usa um parâmetro Name que aceita 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 de 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 é "Get". (Quase qualquer tipo de cmdlet capaz de recuperar informações pode processar a entrada da linha de comando.) Para obter mais informações sobre verbos de cmdlet aprovados, consulte Cmdlet Verb Names.

A seguir está a definição para este cmdlet Get-Proc. Os detalhes dessa definição são fornecidos em Creating Your First 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. Este cmdlet Get-Proc define uma propriedade que representa o parâmetro Name conforme descrito em Adicionando parâmetros que processam a entrada da 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 vinculados aos valores de entrada pelo tempo de execução 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 tempo de execução do Windows PowerShell vincule o parâmetro ao objeto de entrada se o objeto for do mesmo tipo que o parâmetro ou se puder ser coagido ao mesmo tipo. A palavra-chave ValueFromPipelineByPropertyName também é definida como true para que o tempo de execução do Windows PowerShell verifique o objeto de entrada em busca de uma propriedade Name. Se o objeto de entrada tiver essa propriedade, o tempo de execução associará o parâmetro Name à propriedade Name do objeto de entrada.

Observação

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

Substituindo um método de processamento de entrada

Se o cmdlet for 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 Creating Your First Cmdlet.

Este cmdlet Get-Proc substitui o método System.Management.Automation.Cmdlet.ProcessRecord para manipular a entrada de parâmetro Name fornecida pelo usuário ou por um script. Este método obterá os processos para cada nome de processo solicitado ou todos os processos se nenhum nome for fornecido. Observe que dentro 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 dizer ao tempo de execução 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 C# completo, consulte GetProcessSample03 Sample.

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 formatando.

Criando 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 seu 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 seguintes comandos para recuperar os nomes dos processos 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 seguintes linhas 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
    

Ver também

Adicionando parâmetros que processam a entrada da 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