PowerShell:如何获取管道收集的数量?

问题描述 投票:1回答:1

假设我有一个生成对象集合的过程。对于一个非常简单的示例,请考虑$(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之前被问过,可接受的答案是在可用于集合的脚本块内使用一个计数器变量。问题是我已经有了该计数器,而我想要的是检查该计数器的结果是否正确。因此,我不想只在脚本块中计数。我想要一个单独的,独立的指标来衡量我沿着管道发送的集合的大小。我该怎么办?

powershell count size
1个回答
0
投票

如果需要处理计数:

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的默认行为,但它也支持多种其他操作,例如summing Measure-Objectaveraging([C0 ]),可以选择将其合并为一个调用。
© www.soinside.com 2019 - 2024. All rights reserved.