【问题标题】:How to count objects in PowerShell?如何计算 PowerShell 中的对象?
【发布时间】:2012-07-16 14:21:01
【问题描述】:

正如我在 PowerShell 用户指南中所读到的,PowerShell 的核心概念之一是命令接受和返回 objects 而不是文本。例如,运行get-alias 会返回一些System.Management.Automation.AliasInfo 对象:

PS Z:\> 获取别名 命令类型名称定义 ------------ ---- ---------- 别名 % ForEach-Object 别名? Where-对象 别名 ac 添加内容 别名 asnp Add-PSSnapIn 别名 cat 获取内容 Alias cd Set-Location 别名 chdir Set-Location ...

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

【问题讨论】:

    标签: powershell scripting


    【解决方案1】:
    Get-Alias|ForEach-Object {$myCount++};$myCount
    

    158

    【讨论】:

      【解决方案2】:

      在我的交流中,你提供的 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 语法。
      【解决方案3】:

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

      (get-alias).count
      

      【讨论】:

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

      @($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 你不能强制输出是一个数组。 ..一旦输出已经完成。你在做什么。
      【解决方案5】:

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

      @(Get-Alias).Count
      

      需要注意的几点:

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

        @(Get-Process | ? { $_.ProcessName -eq "svchost" }).Count
        
      2. 初始 at 符号 (@) 对于稳健的解决方案是必要的。只要答案是 2 或更大,您将得到带有或不带有 @ 的等效答案,但是当答案是 0 或 1 时,除非您有 @ 符号,否则您将得到 no 输出! (它通过强制输出为数组来强制 Count 属性存在。)

      2012.01.30 更新

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

      【讨论】:

      • 我知道这是旧的,但对于寻找这个的其他人来说……如果使用 Set-StrictMode -Version Latest,如果没有 @ for count
      • 很好,@vr8ce!我也是Set-StrictMode 的坚定拥护者,所以我应该注意到这一点。
      • 为了扩展@vr8ce 的建议,我不能使用@($myObject) 来计算现有对象。所以我在尝试测试 count 属性之前使用if ($myObject.PSobject.Properties.Name -contains "count")(来自stackoverflow.com/questions/26997511/…)。我讨厌 PoSH 让我这样做,但严格模式是值得的。
      【解决方案6】:

      这会让你数数:

      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

      【讨论】:

      • 我使用了$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 摆脱%{}。更容易写和读的有待讨论。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-04
      • 2020-07-23
      • 1970-01-01
      • 2023-04-05
      相关资源
      最近更新 更多