如何在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
有几点需要注意:
-
您可以将任意复杂的expression式replace为
Get-Alias
,例如:@(Get-Process | ? { $_.ProcessName -eq "svchost" }).Count
-
最初的符号(@)是强大的解决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的任何情况都是正确的。