Пользуясь функциями и фильтрами в 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" } }
В каждой из секций выводится значение двух переменных. $a соответствует тому значению, что мы зададим при запуске функции. $n определяется на этапе инициализации и последовательно увеличивается на этапе обработки. После этого на этапе обработки выводится значение текущего объекта, поступившего по конвейеру.
Укажем в качестве $a число 5 и передадим по конвейеру числа от 3 до 5:
Попробуем запустить функцию без конвейера:
Как видим, команды из секции Process запускаются один раз даже при отсутствии конвейера.
Итак, при помощи разделов Begin, Process и End мы можем придать функции преимущества командлета.
Статьи по теме: