Почему вы не можете пайпить из любых высказываний PowerShell (foreach, while и т. Д.)?

Почему вы не можете транслировать из любых операторов PowerShell, таких как foreach и while ("пустой элемент pipe не разрешен")? Есть ли какие-то технические ограничения?

PS /Users/me> foreach ($i in 1,2,3) { $i } | measure

At line:1 char:30
+ foreach ($i in 1,2,3) { $i } | measure
+                              ~
An empty pipe element is not allowed.
+ CategoryInfo          : ParserError: (:) [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : EmptyPipeElement


PS /Users/me> for ($i = 1;$i -lt 10; $i++) { $i } | measure    

At line:1 char:37
+ for ($i = 1;$i -lt 10; $i++) { $i } | measure                                                                         
+                                     ~
An empty pipe element is not allowed.
+ CategoryInfo          : ParserError: (:) [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : EmptyPipeElement


PS /Users/me> $i = 1
PS /Users/me> while ($i -lt 10 ) { $i;$i++ } | measure                                     

At line:1 char:32
+ while ($i -lt 10 ) { $i;$i++ } | measure                                                 
+                                ~
An empty pipe element is not allowed.
+ CategoryInfo          : ParserError: (:) [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : EmptyPipeElement

Список операторов PowerShell:

если еще

переключатель

Делать пока

Для каждого

За

В то время как

Перерыв

Продолжить

1 ответ

Как вы заметили, операторы языка PowerShell не выводятся в конвейер (отсюда и ошибка - "пустой элемент канала не разрешен"). Вот два возможных обходных пути:

  1. Оберните заявление с $() (подвыражение) оператор. Пример:

    $(foreach ($i in 1,2,3) { $i }) | Measure-Object
    
  2. Оберните заявление в { } (т. е. сделать его скриптовым блоком) и вызвать его с & (вызов / вызов) оператор. Пример:

    & { foreach ($i in 1,2,3) { $i } } | Measure-Object
    

Разница между ними заключается в том, что синтаксис блока скриптов создает новую область, поэтому переменные в этой области располагаются по завершении вызова. В приведенных выше двух примерах это означает, что $i определяется после выполнения первого примера, но не после выполнения второго. Эта разница может быть полезна в зависимости от того, что вы пытаетесь сделать. (Например, я предпочитаю второй синтаксис при работе в командной строке PowerShell, чтобы избежать загрязнения текущей области временными переменными.)

Другие вопросы по тегам