Поделиться через


Вызов командлета из командлета в командлете

В этом примере показано, как вызвать двоичный командлет, производный от [System.Management.Automation.Cmdlet] непосредственно из другого двоичного командлета, который позволяет добавить функциональные возможности вызываемого командлета в разрабатываемый двоичный командлет. В этом примере вызывается командлет Get-Process для получения процессов, выполняемых на локальном компьютере. Вызов командлета Get-Process эквивалентен следующей команде. Эта команда извлекает все процессы, имена которых начинаются с символов "a" до "t".

Get-Process -Name [a-t]*

Это важно

Можно вызвать только те командлеты, которые являются производными непосредственно от класса System.Management.Automation.Командлет. Невозможно вызвать командлет, производный от класса System.Management.Automation.PSCmdlet. Пример см. в разделе Как вызвать PSCmdlet изPSCmdlet.

Вызов командлета из командлета в командлете

  1. Убедитесь, что сборка, определяющая вызываемый командлет, ссылается и добавляется соответствующая инструкция using. В этом примере добавляются следующие пространства имен.

    using System.Diagnostics;
    using System.Management.Automation;   // PowerShell assembly.
    using Microsoft.PowerShell.Commands;  // PowerShell cmdlets assembly you want to call.
    
  2. В методе обработки входных данных командлета создайте новый экземпляр вызываемого командлета. В этом примере создается объект типа Microsoft.PowerShell.Commands.GetProcessCommand вместе со строкой, содержащей аргументы, используемые при вызове командлета.

    GetProcessCommand gp = new GetProcessCommand();
    gp.Name = new string[] { "[a-t]*" };
    
  3. Вызовите метод System.Management.Automation.Командлет.Invoke*, чтобы вызвать командлет Get-Process.

      foreach (Process p in gp.Invoke<Process>())
      {
        Console.WriteLine(p.ToString());
      }
    }
    

Пример

В этом примере командлет Get-Process вызывается из метода System.Management.Automation.Командлет.BeginProcessing командлета.

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 + "!");
    }
  }
}

См. также

написание командлета Windows PowerShell