Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
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-ProcA 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 OUTLOOKInsira as linhas a seguir para obter os objetos de processo que têm uma propriedade
Namedos processos chamados "IEXPLORE". Este exemplo usa o cmdletGet-Process(fornecido pelo Windows PowerShell) como um comando upstream para recuperar os processos "IEXPLORE".PS> Get-Process iexplore | Get-ProcA 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
estendendo tipos de objeto e formatação
como registrar cmdlets, provedores e aplicativos host