Как стать автором
Обновить

Комментарии 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

Замечательный ответ, большое спасибо!

Зарегистрируйтесь на Хабре , чтобы оставить комментарий