Почему вы не можете пайпить из любых высказываний 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 не выводятся в конвейер (отсюда и ошибка - "пустой элемент канала не разрешен"). Вот два возможных обходных пути:
Оберните заявление с
$()
(подвыражение) оператор. Пример:$(foreach ($i in 1,2,3) { $i }) | Measure-Object
Оберните заявление в
{ }
(т. е. сделать его скриптовым блоком) и вызвать его с&
(вызов / вызов) оператор. Пример:& { foreach ($i in 1,2,3) { $i } } | Measure-Object
Разница между ними заключается в том, что синтаксис блока скриптов создает новую область, поэтому переменные в этой области располагаются по завершении вызова. В приведенных выше двух примерах это означает, что $i
определяется после выполнения первого примера, но не после выполнения второго. Эта разница может быть полезна в зависимости от того, что вы пытаетесь сделать. (Например, я предпочитаю второй синтаксис при работе в командной строке PowerShell, чтобы избежать загрязнения текущей области временными переменными.)