【发布时间】:2012-07-27 18:59:12
【问题描述】:
在 PowerShell 中,管道中 cmdlet 的执行顺序似乎没有以明显的方式执行。似乎不是每个 cmdlet 执行然后将结果传递给管道中的下一个 cmdlet,而是在执行前一个 cmdlet 完成之前将 cmdlet 的各个输出对象传递给下一个 cmdlet 的输入。以下证实了这种行为:
1..5 | %{ Write-Host $_; $_ } | %{ Write-Host ([char]($_ + 64)) }
打印
1
A
2
B
3
C
4
D
5
E
看起来正在发生的事情是ForEach-Object cmdlet 的每次执行都将在迭代之前执行其脚本块及其管道中的每个后续命令。
这是实际发生的情况吗?这种行为是否记录在任何地方?对于像ForEach-Object(例如Where-Object 等)这样的所有迭代cmdlet 都是这种情况吗?
我知道我可以将片段包装在一个表达式 ((1..5 | %{ Write-Host $_; $_ }) | %{ Write-Host ([char]($_ + 64)) }) 中,或者将片段分配给一个变量,然后通过管道将其传递给后续的管道命令以避免这种行为,但是有没有办法对每个元素执行操作一个集合,然后将整个集合传递给管道中的下一个命令?
【问题讨论】:
标签: powershell pipeline