如何在PowerShell中计算对象?


140

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

PS Z:\>获取别名

CommandType名称定义
----------- ---- ----------
别名%每个对象
别名?对象在哪里
别名ac添加内容
别名asnp Add-PSSnapIn
别名猫获取内容
别名cd设置位置
别名chdir设置位置
...

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

Answers:


201

这将使您计数:

get-alias | measure

您可以将结果与对象一起使用:

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

如果您还希望在某些变量中使用别名,则可以使用Tee-Object:

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

有关Measure-Object cmdlet的更多信息,请访问Technet

请勿将其与用于时间测量的Measure-Command cmdlet混淆。(再次在Technet上


3
$Counter = $(get-alias | measure).Count正如您所说的那样,如果只有一次出现,我总是将其返回值1。
DarkLite1 2014年

6
另一种选择:get-alias | measure | % { $_.Count }
Shameer 2015年

fyi:measure的缩写Measure-Object;并返回了很多其他的东西-像AverageSumMaximum,等...
BrainSlugs83

1
为什么不只是(gal).count?需要PS v3或更高版本的IIRC。编辑:这已经被回答。
uranibaba

3
@Shameer在我们使用它的同时,可以Get-Alias | Measure-Object | Select-Object -ExpandProperty Count用来摆脱%and {}。更容易写和读的是另一个讨论。
LosManos

110

只要@jumbo的答案是:-),您就可以做得更简洁。这只是返回Count前一个子表达式返回的数组的属性:

@(Get-Alias).Count

需要注意的几点:

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

    @(Get-Process | ? { $_.ProcessName -eq "svchost" }).Count
  2. 初始符号(@)对于可靠的解决方案是必需的。只要答案是两个或两个以上,无论有没有@,您都会得到一个等效的答案,但是当答案为零或一个时,除非有@符号,否则您将不会得到任何输出!(它Count通过强制输出为数组来强制属性存在。)

2012.01.30更新

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


3
我知道这已经很老了,但是对于其他想要寻找的人……如果不使用@ for count <2,v3 +似乎无法工作Set-StrictMode -Version Latest。我今天(在5.1上)刚遇到这个问题-某些交互作用无法在函数中起作用。我将其追踪到其中具有Set-StrictMode的函数;当我交互式设置严格模式时,它也不起作用。
vr8ce

好收获,@ vr8ce!我也是的坚定拥护者Set-StrictMode,所以我应该注意到这一点。
Michael Sorens

为了扩展@ vr8ce的建议,我无法使用@($ myObject)来获取现有对象的计数。因此,在尝试测试count属性之前,我使用了if ($myObject.PSobject.Properties.Name -contains "count")(来自stackoverflow.com/questions/26997511/…)。我讨厌PoSH让我这么做,但严格模式值得这么做。
–duct_tape_coder,

21

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

(get-alias).count

1
这不能为问题提供答案。要批评或要求作者澄清,请在其帖子下方发表评论。
Zo

@Damien OK。我进行了编辑。在SO中,人们通常从第一个答案到最后一个答案。他们不会突然跳入第三个答案并感到困惑。因此,我将其作为前两个答案的延续。答案比编辑后的答案更有意义。
prabhakaran 2014年

1
这个答案已经涵盖了这一点。您基本上只是在重申两年后所说的话。
利亚姆'18

1
@Liam该答案适用于Powershell v2。我的答案是Powershell v3。如您所说,此答案的更新(2012.01.30 Update)确实覆盖/告知了该答案。我只是给了编码部分。
prabhakaran

5

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

我是通过VMware Get-VmQuestion cmdlet找到的:

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

它给出的答案是一个,而

$output

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

对于0和1,似乎只有这种情况。在有限的测试中,大于1的任何内容都是正确的。


克里斯,我认为要获得想要的结果,您需要执行以下操作:@(Get-VmQuestion -VM vm1).count您不能将输出强制为数组...一旦完成输出。你在做什么
丹尼尔·皮尔
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.