如何计算 PowerShell 中的对象?

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

PS Z:\> get-alias


CommandType     Name                                             Definition
-----------     ----                                             ----------
Alias           %                                                ForEach-Object
Alias           ?                                                Where-Object
Alias           ac                                               Add-Content
Alias           asnp                                             Add-PSSnapIn
Alias           cat                                              Get-Content
Alias           cd                                               Set-Location
Alias           chdir                                            Set-Location
...

现在,我如何得到这些对象的计数?

512932 次浏览

这会让你数到:

get-alias | measure

您可以像处理 object 一样处理结果:

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

如果你也想在某个变量中使用别名,你可以使用 Tee-Object:

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

关于措施对象 cmdlet 的更多信息在 Technet上。

不要将它与用于时间测量的措施-命令 cmdlet 混淆

像@jumbo 的回答一样简短的是: ——你可以做得更简洁。 这只返回前面的子表达式返回的数组的 Count属性:

@(Get-Alias).Count

有几点需要注意:

  1. 你可以用一个任意复杂的表达式来代替 Get-Alias,例如:

    @(Get-Process | ? { $_.ProcessName -eq "svchost" }).Count
    
  2. The initial at-sign (@) is necessary for a robust solution. As long as the answer is two or greater you will get an equivalent answer with or without the @, but when the answer is zero or one you will get no output unless you have the @ sign! (It forces the Count property to exist by forcing the output to be an array.)

2012.01.30 Update

The above is true for PowerShell V2. One of the new features of PowerShell V3 is that you do have a Count property even for singletons, so the at-sign becomes unimportant for this scenario.

只要使用括号和“计数”,这适用于 Powershell v3

(get-alias).count

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

我在 VMware Get-Vmquestions cmdlet 中找到了这个:

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

它给出的答案是一个,然而

$output

没有产生任何输出(正确答案是用 Measure方法产生的0)。

这似乎只适用于0和1。在有限的测试中,任何高于1的值都是正确的。

在我的交流 cmd-let 你提出的没有工作,答案是无效的,所以我不得不作出一点更正,并为我工作良好:

@(get-transportservice | get-messagetrackinglog -Resultsize unlimited -Start "MM/DD/AAAA HH:MM" -End "MM/DD/AAAA HH:MM" -recipients "user@domain.com" | where {$_.Event
ID -eq "DELIVER"}).count
Get-Alias|ForEach-Object {$myCount++};$myCount

158