如何计算PowerShell中的对象?

6rvt4ljy  于 2023-02-19  发布在  Shell
关注(0)|答案(7)|浏览(129)

正如我在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
...

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

8ljdwjyq

8ljdwjyq1#

这将使您计数:

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上)

q3qa4bjr

q3qa4bjr2#

@jumbo的答案很短:-)你可以做得更简洁,它只返回由先行子表达式返回的数组的Count属性:

@(Get-Alias).Count

有几点需要注意:
1.可以用任意复杂的表达式代替Get-Alias,例如:

@(Get-Process | ? { $_.ProcessName -eq "svchost" }).Count

1.初始的at符号(@)对于一个健壮的解决方案是必要的。只要答案是2或更大,你将得到一个带或不带@的等价答案,但是当答案是0或1时,你将得到没有输出,除非你有@符号!(它通过强制输出为数组来强制Count属性存在。)

2012年1月30日更新

PowerShell V3的一个新特性是,即使对于单例也有Count属性,因此at符号对于此场景来说变得不重要。

ars1skjm

ars1skjm3#

只需使用括号和'count'。这适用于Powershell v3

(get-alias).count
lmyy7pcs

lmyy7pcs4#

@($output).Count并不总是产生正确的结果。我使用了($output | Measure).Count方法。
我在VMware Get-VmQuestion cmdlet中发现了此问题:

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

它给出的答案是1,而

$output

未生成任何输出(正确答案为0,与Measure方法生成的结果相同)。
这似乎只是0和1的情况。在有限的测试中,任何大于1的值都是正确的。

dw1jzc5e

dw1jzc5e5#

在我的交流中,您提供的cmdlet不起作用,答案为空,因此我必须做一点更正,并且对我来说效果很好:

@(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
vsikbqxv

vsikbqxv6#

Get-Alias|ForEach-Object {$myCount++};$myCount

158

7fhtutme

7fhtutme7#

请尝试此操作以获取对象的总数。(Get-Alias)。Count

相关问题