如何计算PowerShell中的对象数?
正如我在《PowerShell用户指南》中所读到的,PowerShell的核心概念之一是命令接受并返回对象,而不是文本。例如,运行如何计算PowerShell中的对象数?,powershell,scripting,Powershell,Scripting,正如我在《PowerShell用户指南》中所读到的,PowerShell的核心概念之一是命令接受并返回对象,而不是文本。例如,运行get alias会返回许多System.Management.Automation.AliasInfo对象: PS Z:\> get-alias CommandType Name Definition ----------- ----
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
...
PS Z:\>获取别名
命令类型名称定义
----------- ---- ----------
别名%ForEach对象
别名何处物体
别名ac添加内容
别名asnp Add PSSnapIn
别名cat获取内容
别名cd集位置
别名chdir集合位置
...
现在,如何计算这些对象的数量?这将为您计算:
get-alias | measure
您可以像处理对象一样处理结果:
$m = get-alias | measure
$m.Count
如果您希望在某些变量中也有别名,可以使用Tee对象:
$m = get-alias | tee -Variable aliases | measure
$m.Count
$aliases
有关度量对象cmdlet的更多信息,请参见
不要将其与用于时间测量的Measure Command cmdlet混淆。(再说一遍)简而言之@jumbo的答案是:-)你可以做得更简洁。 这只返回antecedent子表达式返回的数组的
Count
属性:
@(Get-Alias).Count
需要注意的几点:
Get Alias
,例如:
@(Get-Process | ? { $_.ProcessName -eq "svchost" }).Count
Count
属性。)上述情况适用于PowerShell V2。PowerShell V3的一个新功能是,即使对于单例,您也有一个
Count
属性,因此at符号在这种情况下变得不重要。只需使用括号和“Count”。这适用于Powershell v3
(get-alias).count
@($output).Count
并不总是产生正确的结果。
我使用了($output | Measure).Count方法
我在VMware Get-VmQuestion cmdlet中发现了这一点:
$output = Get-VmQuestion -VM vm1
@($output).Count
它给出的答案是一个,而
$output
未产生任何输出(使用Measure
方法产生的正确答案为0)
这似乎只是0和1的情况。在有限的测试中,高于1的任何内容都是正确的。在我的交换中,您提供的cmd不起作用,答案是空的,因此我必须进行一些更正,对我来说效果很好:
@(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
这并不能回答这个问题。若要评论或要求作者澄清,请在其帖子下方留下评论。@Damien OK。我做了编辑。因此,人们通常从第一个答案到最后一个答案。他们不会突然跳进第三个答案而感到困惑。所以我把它作为前两个答案的延续。这个答案比这个经过编辑的答案更有意义。这一点已经在本文中介绍过了。你基本上只是重复已经说过两年的话。@利亚姆,答案是针对powershell v2的。我的答案是powershell v3。正如您所说,该答案在该答案的更新(2012.01.30更新)中有详细说明。我只是给出了编码部分。我使用了$Counter=$(获取别名|度量值)。Count
因为它总是在只有一次出现的情况下返回值1,正如您所说。另一个选项:获取别名|度量值|%{$|.Count}
仅供参考:度量值
是度量对象
的缩写;并返回许多其他内容,如平均值
,总和
,最大值
,等等…为什么不只是(gal).计数?需要PS v3或更高的IIRC。编辑:这已经得到了回答。@SHAMER当我们在做的时候,你可以用它来摆脱%
和{}
。更容易写和读的是另一个讨论。Chris,我认为要得到你想要的东西,你需要这样做:@(get-VmQuestion-VM-vm1)。计数你不能强制输出为数组。。。一旦输出已经完成。这就是你正在做的。我知道这是旧的,但对于其他寻找它的人来说…如果使用了@for count<2Set-StrictMode-Version-Latest
,v3+似乎不起作用。我今天(在5.1上)遇到了这个问题——一些交互工作的东西在函数中不起作用。我跟踪到函数中设置了StrictMode;当我以交互方式设置严格模式时,它也不起作用。捕捉得好,@vr8ce!我也是设置StrictMode
的强烈拥护者,所以我应该注意到这一点。要扩展@vr8ce的建议,我不能使用@($myObject)来计算现有对象的数量。因此,在尝试测试count属性之前,我使用了if($myObject.PSobject.Properties.Name-包含“count”)
(from)。我讨厌PoSH让我这么做,但严格模式是值得的。您已经分享了有关使用PowerShell从Exchange中提取信息的好信息,其中隐藏了一个计数,这是一个有效的答案,但不是这个问题的答案。如果您足够仔细地看,您将看到所有4个答案都给出了@(…).count
语法。