在PowerShell中,似乎执行管道中的cmdlet的顺序不会以明显的方式执行。而不是每个cmdlet执行,然后将结果传递到管道中的下一个cmdlet,看起来在执行前一个cmdlet完成之前,cmdlet的单个输出对象将传递到下一个cmdlet的输入。下面证实了这一现象:流水线中ForEach-Object cmdlet的执行顺序如何工作?
1..5 | %{ Write-Host $_; $_ } | %{ Write-Host ([char]($_ + 64)) }
打印
1
A
2
B
3
C
4
D
5
E
这似乎发生了什么事是,ForEach-Object
cmdlet的每次执行将执行其脚本块之前在其管道每个后续命令迭代。
这是实际发生的情况,而且这种行为记录在任何地方?对于所有迭代cmdlet,例如ForEach-Object
(例如Where-Object
等),情况如何?我知道我可以用表达式((1..5 | %{ Write-Host $_; $_ }) | %{ Write-Host ([char]($_ + 64)) }
)包装块或者将一个块分配给一个变量,然后将其传递给后续的管道命令以避免这种行为,但是有没有办法对每个元素执行一个操作集合,然后将整个集合传递给管道中的下一个命令?
同意这一点;问题中的输出对我自己来说很直观。请注意,当您执行'(1..5 |%{Write-Host $ _; $ _})|时,输出会发生变化%{Write-Host([char]($ _ + 64))}'。这将导致'()'中的所有内容首先被执行,然后每个项目被交给外部管道。 – SpellingD 2012-07-27 20:42:47
我记得Jeffrey Snover和Eric Meijer在谈论PowerShell和Monads时的一段视频(Channel 9?),Snover画了一个关于如何将东西压入管道的图表。我会看看我能否找到链接。 – 2012-07-27 20:46:32
这不是很难找到。这里是[链接](http://channel9.msdn.com/Shows/Going+Deep/Expert-to-Expert-Erik-Meijer-and-Jeffrey-Snover-Inside-PowerShell) – 2012-07-27 20:48:05