Функции в качестве командлетов в Windows PowerShell

Windows PowerShellПользуясь функциями и фильтрами в Windows PowerShell, можно заметить, что они не дают возможности полностью контролировать обработку элементов, поступающих по конвейеру от предыдущей команды. Функции прерывают процесс конвейеризации, пока не будут сформированы все входные объекты. Что касается фильтров, то те не позволяют выполнять действия перед обработкой первого элемента койвейера или после обработки последнего. Что характерно, командлеты подобных недостатков лишены. Ниже узнаем как реализовать функциональность командлетов и для функций.

Чтобы функция получила преимущества командлета, необходимо использовать три специальных раздела: Begin, Process и End. Тогда появится возможность инициализировать внутри функции специальные переменные перед началом работы с поступающими по конвейеру элементами, обрабатывать каждый элемент, не дожидаясь формирования следующих, и выполнять завершающие действия после обработки всех элементов. Синтаксис подобной функции, представленный в общем виде, будет выглядеть так:

Function имя_функции ( параметры ) {

  Begin {

     блок_кода_инициализация

  }

  Process  {

     блок_кода_обработка_элемента

  }

  End {

      блок_кода_завершение

  }

}

Begin определяет участок, команды из которого будут выполнены перед обработкой первого элемента конвейера. Команды из участка Process выполняются при получении каждого нового элемента по конвейеру. Доступ к текущему элементу осуществляется через переменную $_.

Вот небольшой пример на эту тему:

Function Comandlet ($a) {
Begin {
$n = 0; "Инициализация: n=$n, a=$a" }
Process {
$n++
"Обработка конвейера: n=$n, a=$a, текущий объект = $_" }
End { "Завершение: n=$n, a=$a" }
}

Функции в качестве командлетов в Windows PowerShell

В каждой из секций выводится значение двух переменных. $a соответствует тому значению, что мы зададим при запуске функции. $n определяется на этапе инициализации и последовательно увеличивается на этапе обработки. После этого на этапе обработки выводится значение текущего объекта, поступившего по конвейеру.

Укажем в качестве $a число 5 и передадим по конвейеру числа от 3 до 5:

Функции в качестве командлетов в Windows PowerShell

Попробуем запустить функцию без конвейера:

Функции в качестве командлетов в Windows PowerShell

Как видим, команды из секции Process запускаются один раз даже при отсутствии конвейера.

Итак, при помощи разделов Begin, Process и End мы можем придать функции преимущества командлета.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *