假设我有一个生成对象集合的过程。对于一个非常简单的示例,请考虑$(1 | get-member)
。我可以获得生成的对象数量:
PS C:\WINDOWS\system32> $(1 | get-member).count
21
或者我可以对那些对象做些事情。
PS C:\WINDOWS\system32> $(1 | get-member) | ForEach-object {write-host $_.name}
CompareTo
Equals
...
只有21个对象,执行上述操作没问题。但是,如果该过程生成成千上万个对象怎么办?然后,我不想只运行一次以计数对象,然后再次运行以执行我想对它们执行的操作。因此,如何获取管道中发送的集合中的对象计数?
A similar question之前被问过,可接受的答案是在可用于集合的脚本块内使用一个计数器变量。问题是我已经有了该计数器,而我想要的是检查该计数器的结果是否正确。因此,我不想只在脚本块中计数。我想要一个单独的,独立的指标来衡量我沿着管道发送的集合的大小。我该怎么办?
如果需要处理和计数:
在ForEach-Object
脚本块内进行自己的计数是避免两遍处理的最佳选择。
问题是我已经有了该计数器,而我想要的是检查该计数器的结果是否正确。
[ForEach-Object
被可靠地调用给每个输入对象,包括$null
值,因此不需要再次检查。
如果需要更清晰的[[separation处理和计数,则可以将multiple -Process
脚本块传递给ForEach-Object
(在此示例中,{ $_ + 1 }
是输入-处理]] >脚本块,{ ++$count }
是输入-counting一个):PS> 1..5 | ForEach-Object -Begin { $count = 0 } `
-Process { $_ + 1 }, { ++$count } `
-End { "--- count: $count" }
2
3
4
5
6
--- count: 5
注意,由于,以便传递多个ForEach-Object
的参数绑定中的一个怪癖,实际上传递-Begin
和-End
脚本块是必需
-Process
(每个输入对象)块;如果您实际上不需要$null
和/或-Begin
,则通过-End
-请参阅this GitHub issue。还请注意,$count
变量位于调用方的作用域内,并且不属于ForEach-Object
调用;也就是说,$count = 0
可能会更新先前存在的$count
变量,并且,如果以前不存在,则在ForEach-Object
调用之后继续存在。如果需要only
计数:[Measure-Object
是要与管道中的大型输入集合一起使用的cmdlet:下面的示例一个接一个地生成100,000个整数,并让Measure-Object
对其一一计数,而没有将整个输入收集到内存中。
Measure-Object
:Caveat
PS> (& { $i=0; while ($i -lt 1e5) { (++$i) } } | Measure-Object).Count
100000
忽略输入集合中的Measure-Object
值-请参见$null
。请注意,虽然counting
输入对象是this GitHub issue的默认行为,但它也支持多种其他操作,例如summingMeasure-Object
和averaging([C0 ]),可以选择将其合并为一个调用。