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

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

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:

если еще

Выключатель

Делать пока

Для каждого

За

Пока

Ломать

Продолжать


person js2010    schedule 01.06.2018    source источник
comment
Чего вы на самом деле пытаетесь достичь? Показанные вами операторы не возвращают объект; так что трубить нечего.   -  person gvee    schedule 01.06.2018
comment
Возможный дубликат каналов и циклов foreach   -  person BenH    schedule 01.06.2018
comment
Неопределенности в грамматике, которые мы не смогли разрешить. - Брюс Пайетт   -  person js2010    schedule 01.06.2018


Ответы (1)


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

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

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

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

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

person Bill_Stewart    schedule 01.06.2018