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

Почему вы не можете транслировать из любых операторов 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:

if .. else

Switch

Do .. while

ForEach

Для

Пока

Перерыв

Продолжить

1 Ответ

0 голосов
/ 01 июня 2018

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

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

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

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

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

...