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 na conduta que se origina de um cmdlet a montante. Esta secção descreve como adicionar um parâmetro ao Get-Proc cmdlet (descrito na Criação do Primeiro Comandante)para que o cmdlet possa processar objetos de gasoduto.

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

Definição da Classe Cmdlet

O primeiro passo na criação de cmdlet é sempre nomear o cmdlet e declarar a classe .NET que implementa o cmdlet. Este cmdlet recupera informações do processo, por isso 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 o Cmdlet Verb Names.

Segue-se a definição para este Get-Proc cmdlet. Os detalhes desta definição são dados na Criação do Seu Primeiro Comandante.

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

Definição da entrada do gasoduto

Esta secção descreve como definir a entrada do gasoduto para um cmdlet. Este Get-Proc cmdlet define uma propriedade que representa o Name parâmetro descrito na Adição de Parâmetros que Process Command Line Input. (Consulte este tópico para informações gerais sobre a declaração de parâmetros.)

No entanto, quando um cmdlet precisa de processar a entrada do gasoduto, deve ter os seus parâmetros ligados aos valores de entrada até ao tempo de execução Windows PowerShell. Para tal, deve adicionar a ValueFromPipeline palavra-chave ou adicionar a ValueFromPipelineByProperty palavra-chave à declaração de atributos System.Management.Automation.. Especifique a ValueFromPipeline palavra-chave se o cmdlet aceder ao objeto de entrada completo. Especificar se ValueFromPipelineByProperty o cmdlet acede apenas a uma propriedade do objeto.

Aqui está a declaração de parâmetro para o Name parâmetro deste Get-Proc cmdlet que aceita a entrada do gasoduto.

[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 ValueFromPipeline palavra-chave para true que o tempo de execução Windows PowerShell ligue o parâmetro ao objeto de entrada se o objeto for o mesmo tipo que o parâmetro, ou se puder ser coagido ao mesmo tipo. A ValueFromPipelineByPropertyName palavra-chave também é definida para true que o tempo de execução Windows PowerShell verifique o objeto de entrada para uma Name propriedade. Se o objeto de entrada tiver tal propriedade, o tempo de execução ligará o Name parâmetro à propriedade do objeto de Name entrada.

Nota

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

Sobrevam um método de processamento de entrada

Se o seu cmdlet for para manusear a entrada do gasoduto, tem de anular os métodos de processamento de entrada adequados. Os métodos básicos de processamento de entrada são introduzidos na Criação do Seu Primeiro Comandante.

Esta Get-Proc cmdlet substitui o método System.Management.Automation.Cmdlet.ProcessRecord para lidar com a entrada de Name parâmetros fornecida pelo utilizador 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. Note que dentro do System.Management.Automation.Cmdlet.ProcessRecord, a chamada para WriteObject (System.Object,System.Boolean) é o mecanismo de saída para o envio de objetos de saída para o pipeline. O segundo parâmetro desta enumerateCollection chamada, está definido para true dizer ao Windows PowerShell tempo de execução para enumerar a matriz de objetos de processo, e escrever um processo de cada vez para a 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

Amostra de código

Para obter o código de amostra completo C#, consulte a amostra GetProcessSample03.

Definição de tipos de objetos e formatação

Windows PowerShell transmite informações entre cmdlets utilizando objetos .Net. Consequentemente, um cmdlet pode ter de definir o seu próprio tipo, ou o cmdlet pode ter de estender um tipo existente fornecido por outro cmdlet. Para obter mais informações sobre a definição de novos tipos ou a extensão dos tipos existentes, consulte a extensão dos tipos de objetos e a formatação.

Construção do Comandante

Após a implementação de um cmdlet, deve ser registado com Windows PowerShell através de um encaixe Windows PowerShell. Para obter mais informações sobre o registo de cmdlets, consulte Como Registar Cmdlets, Fornecedores e Aplicações de Anfitrião.

Testar o Cmdlet

Quando o seu cmdlet estiver registado com Windows PowerShell, teste-o executando-o na linha de comando. Por exemplo, teste o código para o cmdlet da amostra. Para obter mais informações sobre a utilização de cmdlets da linha de comando, consulte o Início com Windows PowerShell.

  • Na Windows PowerShell, insira os seguintes comandos para recuperar os nomes do processo através do oleoduto.

    PS> type ProcessNames | get-proc
    

    Aparece a seguinte saída.

    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
    
  • Introduza as seguintes linhas para obter os objetos de processo que têm uma Name propriedade dos processos denominados "IEXPLORE". Este exemplo utiliza o Get-Process cmdlet (fornecido por Windows PowerShell) como um comando a montante para recuperar os processos "IEXPLORE".

    PS> get-process iexplore | get-proc
    

    Aparece a seguinte saída.

    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

Adicionar parâmetros que processam a entrada da linha de comando

Criando o seu primeiro Comandante

Ampliação de tipos de objetos e formatação

Como registar cmdlets, fornecedores e aplicações de anfitrião

Windows PowerShell Reference (Referências do Windows PowerShell)

Cmdlet Samples (Exemplos de Cmdlets)