167

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

PS Z:\> 获取别名

命令类型名称定义
------------ ---- ----------
别名 % ForEach-Object
别名?Where-对象
别名 ac 添加内容
别名 asnp Add-PSSnapIn
别名 cat 获取内容
Alias cd Set-Location
别名 chdir Set-Location
...

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

4

6 回答 6

234

这会让你数数:

get-alias | measure

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

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

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

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

Technet上提供了有关 Measure-Object cmdlet 的更多信息。

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

于 2012-07-17T15:54:29.593 回答
124

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

@(Get-Alias).Count

有几点需要注意:

  1. 您可以使用任意复杂的表达式代替Get-Alias,例如:

    @(Get-Process | ? { $_.ProcessName -eq "svchost" }).Count
    
  2. 对于稳健的解决方案,初始 at 符号 (@) 是必需的。只要答案是 2 或更大,您将得到带有或不带有 @ 的等效答案,但是当答案是 0 或 1 时,除非您有 @ 符号,否则您将不会得到任何输出!(它Count通过强制输出为数组来强制属性存在。)

2012.01.30 更新

以上适用于 PowerShell V2。PowerShell V3 的新功能之一是Count即使对于单例,您也确实有一个属性,因此在这种情况下 at 符号变得不重要。

于 2012-07-18T20:57:10.237 回答
24

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

(get-alias).count
于 2014-03-26T11:17:54.590 回答
6

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

我通过 VMware Get-VmQuestion cmdlet 找到了这个:

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

它给出的答案是一个,而

$output

没有产生任何输出(正确答案是 0 与该Measure方法产生的结果相同)。

这似乎只是 0 和 1 的情况。任何高于 1 的东西在有限的测试中都是正确的。

于 2015-07-21T14:44:45.067 回答
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
于 2020-09-09T20:57:57.670 回答
0
Get-Alias|ForEach-Object {$myCount++};$myCount

158

于 2021-12-04T21:56:12.087 回答