
Чтобы функция получила преимущества командлета, необходимо использовать три специальных раздела: 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 мы можем придать функции преимущества командлета.