Оба ответа до сих пор дают вам полезную информацию о конвейерной обработке. Однако есть еще что сказать.
Во-первых, чтобы напрямую ответить на ваш вопрос, вы указали два возможных способа работы конвейера. И они оба правы... в зависимости от командлетов по обе стороны трубы! Однако способ работы конвейера должен ближе к вашему второму понятию: объекты обрабатываются по одному за раз. (Хотя нет гарантии, что объект пройдет весь путь до того, как будет запущен следующий, потому что каждый компонент в конвейере является асинхронным, как упомянул С. Нэш.)
Итак, что я имею в виду под «это зависит от ваших командлетов»? Если вы говорите о командлетах, поставляемых Microsoft, то, скорее всего, все они работают так, как вы ожидаете, пропуская каждый объект через конвейер настолько эффективно, насколько это возможно. Но если вы говорите о командлетах, которые вы пишете, это зависит от того, как вы их пишете: написать командлеты, которые не могут правильно выполнить конвейерную обработку, так же легко, как и те, которые преуспевают!
Существует два основных режима отказа:
- генерация всего вывода перед отправкой в конвейер, или
- сбор всех входных данных конвейера перед их обработкой.
Конечно, вы хотите стремиться к тому, чтобы обрабатывать каждый ввод, как только он получен, и выдавать его вывод, как только он определен. Подробные примеры см. в моей статье Входы и выходы конвейера PowerShell, только что опубликованные на Simple-Talk.com.
person
Michael Sorens
schedule
07.11.2015