如何在PowerShell中计数对象?

正如我在PowerShell用户指南中阅读的,PowerShell的核心概念之一是命令接受和返回对象,而不是文本。 例如,运行get-alias返回一些System.Management.Automation.AliasInfo对象:

 PS Z:\> get-alias

 CommandType名称定义
 ----------- ---- ----------
别名%ForEach对象
别名? 位置对象
别名ac Add-Content
别名asnp Add-PSSnapIn
别名猫Get-Content
别名cd Set-Location
别名chdir Set-Location
 ...

现在, 我如何获得这些对象的数量?

这会让你数:

 get-alias | measure 

您可以像对象一样处理结果:

 $m = get-alias | measure $m.Count 

如果你想在别的variables中有别名,你可以使用Tee-Object:

 $m = get-alias | tee -Variable aliases | measure $m.Count $aliases 

有关Measure-Object cmdlet的更多信息在Technet上 。

不要将它与用于时间测量的Measure-Command cmdlet混淆。 (再次在Technet上 )

只要@ jumbo的答案是:-)你可以做得更简洁。 这只是返回由前导子expression式返回的数组的Count属性:

 @(Get-Alias).Count 

有几点需要注意:

  1. 您可以将任意复杂的expression式replace为Get-Alias ,例如:

     @(Get-Process | ? { $_.ProcessName -eq "svchost" }).Count 
  2. 最初的符号(@)是强大的解决scheme所必需的。 只要答案是两个或两个以上,你会得到一个等效的答案,不pipe有没有@,但是当答案是零或一个,你将不会得到输出,除非你有@符号! (通过强制输出为数组,强制Count属性存在。)

2012.01.30更新

以上是PowerShell V2的情况。 PowerShell V3的一个新function是,即使对于单例,你也有一个Count属性,所以在这种情况下,at-sign变得不重要。

只需使用括号和“计数”。 这适用于Powershell v3

 (get-alias).count 

@($output).Count并不总是产生正确的结果。 我使用($output | Measure).Count方法。

我发现这与VMware Get-VmQuestion cmdlet:

 $output = Get-VmQuestion -VM vm1 @($output).Count 

它给出的答案是一个,而

 $output 

没有产生输出(正确答案是0,与Measure方法一样)。

只有0和1才是这种情况。高于1的任何情况都是正确的。