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


Добавление параметров для обработки входных данных конвейера

Одним из источников входных данных для командлета является объект в конвейере, который создается из вышестоящего командлета. В этом разделе описывается, как добавить параметр в командлет Get-Proc (описано в разделе создание первого командлета), чтобы командлет смог обработать объекты конвейера.

Этот командлет Get-Proc использует параметр Name, принимающий входные данные из объекта конвейера, извлекает сведения о процессе с локального компьютера на основе указанных имен, а затем отображает сведения о процессах в командной строке.

Определение класса командлета

Первым шагом в создании командлета является всегда именование командлета и объявление класса .NET, реализующего командлет. Этот командлет извлекает сведения о процессе, поэтому выбранное здесь имя команды — Get. (Практически любой вид командлета, который может получить информацию, может обрабатывать входные данные командной строки.) Дополнительные сведения о утвержденных командах командлетов см. в имена командлетов.

Ниже приведено определение этого Get-Proc командлета. Сведения об этом определении приведены в создании первого командлета.

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

Определение входных данных из конвейера

В этом разделе описывается определение входных данных из конвейера для командлета. Этот командлет Get-Proc определяет свойство, представляющее параметр Name, как описано в добавлении параметров, которые обрабатывают входныекомандной строки. (Общие сведения об объявлении параметров см. в этом разделе.)

Однако если командлету необходимо обработать входные данные конвейера, он должен иметь свои параметры, привязанные к входным значениям среды выполнения Windows PowerShell. Для этого необходимо добавить ключевое слово ValueFromPipeline или добавить ключевое слово ValueFromPipelineByProperty в объявление атрибута System.Management.Automation.ParameterAttribute. Укажите ключевое слово ValueFromPipeline, если командлет обращается к полному входной объекту. Укажите ValueFromPipelineByProperty, если командлет обращается только к свойству объекта.

Ниже приведено объявление параметров для параметра Name этого командлета Get-Proc, который принимает входные данные конвейера.

[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

Предыдущее объявление задает ключевое слово ValueFromPipelinetrue, чтобы среда выполнения Windows PowerShell привязыла параметр к входящего объекта, если объект имеет тот же тип, что и параметр, или если он может быть принужен к тому же типу. Ключевое слово ValueFromPipelineByPropertyName также имеет значение true, чтобы среда выполнения Windows PowerShell проверяла входящие объекты для свойства Name. Если входящий объект имеет такое свойство, среда выполнения привязывает параметр Name к свойству Name входящего объекта.

Примечание.

Параметр ключевого слова атрибута ValueFromPipeline для параметра имеет приоритет над параметром для ключевого слова ValueFromPipelineByPropertyName.

Переопределение метода обработки входных данных

Если командлет должен обрабатывать входные данные конвейера, необходимо переопределить соответствующие методы обработки входных данных. Основные методы обработки входных данных представлены в создании первого командлета.

Этот командлет Get-Proc переопределяет метод System.Management.Automation.Cmdlet.ProcessRecord для обработки входных данных параметра Name, предоставленных пользователем или скриптом. Этот метод получает процессы для каждого запрошенного имени процесса или всех процессов, если имя не указано. Обратите внимание, что в System.Management.Automation.Cmdlet.ProcessRecordвызов WriteObject(System.Object,System.Boolean) — это механизм вывода для отправки выходных объектов в конвейер. Второй параметр этого вызова, enumerateCollection, имеет значение true, чтобы сообщить среде выполнения Windows PowerShell перечислить массив объектов процесса и записать один процесс в командную строку.

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

Пример кода

Полный пример кода C# см. в разделе GetProcessSample03 Sample.

Определение типов объектов и форматирования

Windows PowerShell передает сведения между командлетами с помощью объектов .NET. Следовательно, командлету может потребоваться определить собственный тип, или командлету может потребоваться расширить существующий тип, предоставленный другим командлетом. Дополнительные сведения об определении новых типов или расширении существующих типов см. в расширении типов объектов и форматировании.

Создание командлета

После реализации командлета его необходимо зарегистрировать в Windows PowerShell с помощью оснастки Windows PowerShell. Дополнительные сведения о регистрации командлетов см. в разделе Регистрация командлетов, поставщиков и ведущих приложений.

Тестирование командлета

После регистрации командлета в Windows PowerShell проверьте его, выполнив его в командной строке. Например, проверьте код для примера командлета. Дополнительные сведения об использовании командлетов из командной строки см. в Windows PowerShell.

  • В командной строке Windows PowerShell введите следующие команды, чтобы получить имена процессов через конвейер.

    PS> type ProcessNames | Get-Proc
    

    Отображаются следующие выходные данные.

    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
    
  • Введите следующие строки, чтобы получить объекты процесса, имеющие свойство Name из процессов с именем IEXPLORE. В этом примере используется командлет Get-Process (предоставляемый Windows PowerShell) в качестве команды вышестоящего потока для получения процессов IEXPLORE.

    PS> Get-Process iexplore | Get-Proc
    

    Отображаются следующие выходные данные.

    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
    

См. также

добавление параметров, которые обрабатывают входные командной строки

создании первого командлета

расширения типов объектов и форматирования

Регистрация командлетов, поставщиков и ведущих приложений

справочник по Windows PowerShell

примеры командлетов