Пока:
вы можете использовать выражений в качестве первого сегмента конвейера (например,
1..2 | Tee-Object -Variable result
),
вы не можете использовать составные операторы , такие как if
, while
, foreach
и do
как есть, к сожалению.
То есть такие составные операторы не являются истинными выражениями , даже если вВ контексте присваиваний они могут действовать таким образом. То есть вы можете сделать $result = while ($true) ...
- без включения while
в (...)
- но вы не можете отправить цикл while
напрямую в конвейер.
См. эту проблему GitHub , в котором обсуждается этот проблемный "статус пол-выражения" составных операторов и спрашивается, возможно ли сделать их полными выражениями.
Обходные пути :
Если вы хотите, чтобы ваш циклический составной оператор выводил свои объекты один за другим в конвейер , когда они становятся доступными - то есть, если вам нужен стандарт , streaming конвейерное поведение :
- Оберните ваш составной оператор в
. { ... }
(или в & { ... }
, если вы хотите, чтобы он выполнялся в потомкеобласть видимости). - Например,
. { foreach ($i in 1..2) { $i } } | Tee-Object -Variable result
Если вы хотите собрать все выходные данные из вашего составного оператора циклической обработки впереди , перед отправкой их в конвейер:
- Заключите ваш составной оператор в
$(...)
. - Например,
$(foreach ($i in 1..2) { $i }) | Tee-Object -Variable result
- Примечание. Хотя использование
$(...)
может ускорить ваш конвейер, оно делает это лишь незначительно и происходит за счетпотребление памяти, учитывая, что все выходы должны быть сначала собраны в памяти.
Применительно к вашему случаю:
$result = . {
while ($true) {
<# Generating long list of psobject #>
}
} | Tee-Object -FilePath 'fname.csv' | ...