Продолжаем рассматривать особенности применения функций и конвейеров в Windows PowerShell.
Конвейеры команд — несомненное достоинство PowerShell. Функции могут располагаться внутри конвейеров. В этом случае функция будет принимать входящий поток объектов через специальную переменную $Input.
Для лучшего понимания приведем пример.
Function Summa { $n=0 ForEach ($i in $Input) { $n+=$i } $n }
В данном случае мы создали функцию, которая примется суммировать поступившие к ней по конвейеру элементы. Нам достаточно лишь передать функции массив чисел.
Кроме цикла ForEach можно использовать также метод MoveNext(), а к текущему элементу входного потока обращаться при помощи свойства Current. В таком случае функция примет вид:
Function SummaNew {
$n=0
While ($Input.MoveNext()) {
$n+=$Input.Current
}
$n
}
Запустив функцию, можно убедиться, что мы получили тот же результат.
Как видим, внедрить функцию в конвейер просто. Однако есть момент, который необходимо учитывать.
При получении данных от предыдущей команды функция приостанавливает конвейер и запускается только тогда, когда будет сформирован весь массив входных элементов. Для обхода этого ограничения следует использовать фильтры.
Фильтры являются особыми функциями, которые запускаются отдельно для каждого входящего элемента. В общем виде синтаксис фильтров выглядит:
Filter имя_фильтра { параметры } { блок_кода }
Фильтры отличаются от функций тем, что в них вместо $Input используется специальная переменная $_, которая соответствует текущему элементу, проходящему через фильтр.
Напишем простой фильтр, который будет состоять всего из одной строчки, и проверим его работу.
Filter Primer {$_+10}
В данном случае к каждому элементу конвейера мы прибавляли 10, что и отобразилось на выходе.
Евгений. Запили форум. А мы на нём тоже сидеть буим. И тя вопросами грузить, и дажо помогать решать чьи-то траблы пытатьсо. ))
Даров) Не уверен, если честно, что форумы трафику нагоняют)