ChatGPT解决这个技术问题 Extra ChatGPT

如何计算 PowerShell 中的对象?

正如我在 PowerShell 用户指南中阅读的那样,PowerShell 的核心概念之一是命令接受并返回 objects 而不是文本。例如,运行 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
...

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

(获取别名).Count

j
jumbo

这会让你数数:

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


正如你所说,我使用 $Counter = $(get-alias | measure).Count 因为它总是返回值 1 以防只有一次出现。
另一种选择:get-alias | measure | % { $_.Count }
仅供参考:measureMeasure-Object 的缩写;并返回许多其他内容——例如 AverageSumMaximum 等...
为什么不只是 (gal).count?需要 PS v3 或更高版本的 IIRC。编辑:这已经得到回答。
@Shameer 当我们这样做时,可以使用 Get-Alias | Measure-Object | Select-Object -ExpandProperty Count 摆脱 %{}。更容易编写和阅读的是另一个讨论。
s
svick

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

@(Get-Alias).Count

有几点需要注意:

您可以使用任意复杂的表达式代替 Get-Alias,例如:@(Get-Process | ? { $_.ProcessName -eq "svchost" }).Count强大的解决方案。只要答案是 2 或更大,您将得到带有或不带有 @ 的等效答案,但是当答案是 0 或 1 时,除非您有 @ 符号,否则您将不会得到任何输出! (它通过强制输出为数组来强制存在 Count 属性。)

2012.01.30 更新

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


我知道这已经过时了,但是对于寻找这个的其他人来说……如果没有 @ for count <,v3+ 似乎无法正常工作。 2 如果使用 Set-StrictMode -Version Latest。我今天刚刚遇到这个问题(在 5.1 上)——一些交互工作的东西在函数中不起作用。我将其追踪到具有 Set-StrictMode 的函数;当我以交互方式设置严格模式时,它也不起作用。
好消息,@vr8ce!我也是 Set-StrictMode 的坚定拥护者,所以我应该注意到这一点。
为了扩展@vr8ce 的建议,我无法使用@($myObject) 来计算现有对象。因此,在尝试测试 count 属性之前,我使用了 if ($myObject.PSobject.Properties.Name -contains "count")(来自 stackoverflow.com/questions/26997511/…)。我讨厌 PoSH 让我这样做,但严格模式是值得的。
m
makerofthings7

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

(get-alias).count

这没有提供问题的答案。要批评或要求作者澄清,请在他们的帖子下方留下评论。
@Damien 好的。我进行了编辑。在 SO 中,人们通常从第一个答案到最后一个答案。他们不会突然跳入第三个答案而感到困惑。所以我把它作为前两个答案的延续。这个答案比这个编辑过的答案更有意义。
这已在 this answer 中介绍。你基本上只是在重复两年后已经说过的话。
@Liam该答案适用于powershell v2。我的答案是针对 powershell v3。正如您所说,该答案的更新(2012.01.30 更新)中已涵盖/告知了该答案。我只是给出了编码部分。
b
bchris999

@($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 你不能强制输出是一个数组......一旦输出已经完成.这就是你在做什么。
z
zaerymoghaddam

在我的交流中,你提供的 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

您已经分享了有关使用 PowerShell 从 Exchange 提取信息的好信息,并且隐藏在其中有一个计数,这使其成为一个有效的答案,但不是这个问题的答案。
如果您仔细观察,您会发现 all 4 answers 给出了 @(...).Count 语法。
u
ulidtko
Get-Alias|ForEach-Object {$myCount++};$myCount

158