为什么可以';您不能从任何powershell语句(foreach、while等)中导出吗?

为什么可以';您不能从任何powershell语句(foreach、while等)中导出吗?,powershell,debugging,pipe,statements,Powershell,Debugging,Pipe,Statements,为什么不能从任何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 allo

为什么不能从任何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语句列表:

如果。。否则

开关

做。。当

弗雷奇

为了

中断


继续

正如您所注意到的,PowerShell语言语句不会输出到管道(因此出现错误-“不允许使用空管道元素”)。以下是两种可能的解决方法:

  • 使用
    $()
    (子表达式)运算符包装语句。例如:

    $(foreach ($i in 1,2,3) { $i }) | Measure-Object
    
    & { foreach ($i in 1,2,3) { $i } } | Measure-Object
    
  • 将语句包装在
    {}
    中(即,使其成为脚本块),并使用
    &
    (调用/调用)操作符调用它。例如:

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

  • 两者之间的区别在于scriptblock语法创建了一个新的作用域,因此当调用完成时,该作用域内的变量将被释放。在上述两个示例中,这意味着
    $i
    是在执行第一个示例之后定义的,而不是在执行第二个示例之后定义的。这种差异可能有用,这取决于您尝试做什么。(例如,在使用PowerShell命令行时,我更喜欢使用第二种语法,以避免临时变量污染当前作用域。)

    Get ChildItem-Path C:\\\124; ForEach对象{$\uU0.BaseName}
    您实际想要实现什么?您显示的语句不返回对象;因此,管道没有任何迹象。可能是“语法中我们无法解决的歧义”的重复