Como invocar um cmdlet de dentro de um cmdlet
Este exemplo mostra como invocar um cmdlet binário que deriva de [System.Management.Automation.Cmdlet]
diretamente de dentro de outro cmdlet binário, o que permite adicionar a funcionalidade do cmdlet invocado ao cmdlet binário que você está desenvolvendo. Neste exemplo, o cmdlet Get-Process
é invocado para obter os processos em execução no computador local. A chamada para o cmdlet Get-Process
é equivalente ao comando a seguir. Esse comando recupera todos os processos cujos nomes começam com os caracteres "a" por "t".
Get-Process -Name [a-t]*
Importante
Você pode invocar apenas os cmdlets que derivam diretamente da classe System.Management.Automation.Cmdlet. Você não pode invocar um cmdlet que deriva da classe System.Management.Automation.PSCmdlet. Para obter um exemplo, consulte Como invocar um PSCmdlet de dentro de um PSCmdlet.
Para invocar um cmdlet de dentro de um cmdlet
Verifique se o assembly que define o cmdlet a ser invocado é referenciado e se a instrução
using
apropriada é adicionada. Neste exemplo, os namespaces a seguir são adicionados.using System.Diagnostics; using System.Management.Automation; // PowerShell assembly. using Microsoft.PowerShell.Commands; // PowerShell cmdlets assembly you want to call.
No método de processamento de entrada do cmdlet, crie uma nova instância do cmdlet a ser invocada. Neste exemplo, um objeto do tipo Microsoft.PowerShell.Commands.GetProcessCommand é criado junto com a cadeia de caracteres que contém os argumentos usados quando o cmdlet é invocado.
GetProcessCommand gp = new GetProcessCommand(); gp.Name = new string[] { "[a-t]*" };
Chame o método System.Management.Automation.Cmdlet.Invoke* para invocar o cmdlet
Get-Process
.foreach (Process p in gp.Invoke<Process>()) { Console.WriteLine(p.ToString()); } }
Exemplo
Neste exemplo, o cmdlet Get-Process
é invocado de dentro do método System.Management.Automation.Cmdlet.BeginProcessing de um cmdlet.
using System;
using System.Diagnostics;
using System.Management.Automation; // PowerShell assembly.
using Microsoft.PowerShell.Commands; // PowerShell cmdlets assembly you want to call.
namespace SendGreeting
{
// Declare the class as a cmdlet and specify an
// appropriate verb and noun for the cmdlet name.
[Cmdlet(VerbsCommunications.Send, "GreetingInvoke")]
public class SendGreetingInvokeCommand : Cmdlet
{
// Declare the parameters for the cmdlet.
[Parameter(Mandatory = true)]
public string Name { get; set; }
// Override the BeginProcessing method to invoke
// the Get-Process cmdlet.
protected override void BeginProcessing()
{
GetProcessCommand gp = new GetProcessCommand();
gp.Name = new string[] { "[a-t]*" };
foreach (Process p in gp.Invoke<Process>())
{
WriteVerbose(p.ToString());
}
}
// Override the ProcessRecord method to process
// the supplied user name and write out a
// greeting to the user by calling the WriteObject
// method.
protected override void ProcessRecord()
{
WriteObject("Hello " + Name + "!");
}
}
}