Можно ли передать результат цикла while без присваивания переменной - PullRequest
1 голос
/ 21 октября 2019

Следующий код не работает

$result = (
    while ($true) { 
        <# Generating long list of psobject #> 
    }) | Tee-Object -FilePath 'fname.csv' | Group-Object -Property xxx | Select Name,Count

Термин while не распознается как имя командлета, функции, файла сценария или работоспособной программы. Проверьте правильность написания имени или, если путь был указан, проверьте правильность пути и повторите попытку.

1 Ответ

2 голосов
/ 21 октября 2019

Пока:

  • вы можете использовать выражений в качестве первого сегмента конвейера (например,
    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' | ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...