Комментарии 4
Ни в одной из ваших функций, которые используют
[parameter(ValueFromPipeline)]
нет блока PROCESS {}
Вы учите как НЕ надо писать коммандлеты....
Расскажите подробнее. Периодически пишу скрипты на поше, но так глубоко не вкапывался :)
Пайплайны прежде всего предназначены для потоковой обработки данных.
В статье же предлагается использовать пайплайны в функциональном стиле.
Это, конечно, не запрещено, но надо понимать разницу. А для начинающего эта разница может оказаться "фатальной"
Банальнейший пример:
>function addition([parameter(valuefrompipeline)]$v) { $v+1 }
>1,2,3 | addition
Написавший функцию будет ожидать ответ
2
3
4
но получит просто
4
Классическая "полная" функция с поддержкой пайплайнов — состоит из трёх функциональных блоков
function Do-Something([Parameter(ValueFromPipeline)]$param, $simpleParam) {
BEGIN { # подготовка пайплайна к работе, инициализация }
PROCESS { # собственно работа }
END { # Финальная обработка, выдача суммарного результата, очистка }
}
Обычные параметры видны во всех трёх блоках, те что поддерживают пайплайн — обычно в PROCESS{}, он вызывается многократно, для каждого из значений на входе,
последнее из пайплайна видно также в END{}
Функции из статьи — это функции у которых есть только блок END {}
Они, конечно, получат своё значение из помеченного ValueFromPipeline параметра, но только последнее.
Поэтому чтобы получить ожидаемые 2.3.4 правильно было бы написать
>function addition([parameter(valuefrompipeline)]$v) { PROCESS{ $v+1 } }
В случае всего одного параметра на входе ничего не сломается, а при нескольких будет работать правильно
Вот пример использования всех блоков
>function Get-Summary([parameter(valuefrompipeline)]$v) {
BEGIN{ $s = 0 }
PROCESS{ $s+=$v; $v }
END{ "Total: $s" }
}
> 1,2,3 | Get-Summary
1
2
3
Total: 6
Правильно пишем командлеты на Powershell и заодно симулируем парадокс Монти Холла