【问题标题】:How to use the "-Property" parameter for PowerShell's "Measure-Object" cmdlet?如何为 PowerShell 的“Measure-Object”cmdlet 使用“-Property”参数?
【发布时间】:2011-09-30 18:44:13
【问题描述】:

为什么

$a = GPS AcroRd32 | Measure
$a.Count

工作,什么时候

GPS AcroRd32 | Measure -Property Count

没有?

第一个例子返回一个值2,这就是我想要的,一个整数。

第二个例子返回这个:

Measure-Object : Property "Count" cannot be found in any object(s) input.
At line:1 char:23
+ GPS AcroRd32 | Measure <<<<  -Property Count
    + CategoryInfo          : InvalidArgument: (:) [Measure-Object], PSArgumentException
    + FullyQualifiedErrorId : GenericMeasurePropertyNotFound,Microsoft.PowerShell.Commands.MeasureObjectCommand



This Scripting Guy entry 是我在第一个代码示例中学习如何使用“计数”属性的地方。

第二个代码示例确实令人困惑。在this Script Center reference 中,以下语句有效:

Import-Csv c:\scripts\test.txt | Measure-Object score -ave -max -min

即使这样重写它仍然有效:

Import-Csv c:\scripts\test.txt | Measure-Object -ave -max -min -property score

在我考虑Measure-Object help page 之前,我接受这个并没有太多问题。 -Property &lt;string[]&gt; 的参数定义声明:

默认是对象的计数(长度)属性。

如果Count 是默认值,那么Count 的显式传递不应该起作用吗?

GPS AcroRd32 | Measure -Property Count # Fails

以下内容为我提供了我需要的信息,但它没有为我提供用于执行操作的整数,如您所见:

PS C:\Users\Me> $a = GPS AcroRd32 | Measure
PS C:\Users\Me> $a

Count    : 2
Average  :
Sum      :
Maximum  :
Minimum  :
Property :

PS C:\Users\Me> $a -is [int]
False



那么,为什么点表示法 ($a.count) 有效,而不是明确的书面声明 (GPS | Measure -Property Count)?

如果我应该使用点表示法,那么我会,但我想借此机会详细了解 如何*为什么 PowerShell 的工作原理这样,而不是仅仅建立对 PowerShell 语法的敷衍理解。换句话说,我想避免变成Cargo Cult Programmer/Code Monkey

【问题讨论】:

    标签: powershell syntax powershell-2.0


    【解决方案1】:

    因为COUNT 属性是OUTPUT 对象的属性(即Measure-Object 的结果),而不是INPUT 对象。

    -property 参数指定要评估输入对象的哪些属性。这些都不是COUNT,除非你传递一个或多个数组或其他东西。

    【讨论】:

      【解决方案2】:

      我认为你想要的是这样的:

      gps AcroRd32 | measure-object | select -expand Count
      

      【讨论】:

        【解决方案3】:

        您需要知道的一件事是,通常在 PowerShell 中,特别是在 Cmd 中,您可以操作对象或对象集合。

        示例:如果只有一个 'AcroRd32' 正在运行,Get-Process 将返回 [System.Diagnostics.Process],如果有多个正在运行,它将返回 [System.Diagnostics.Process] 的集合。

        第二种情况可以这样写:

        (GPS AcroRd32).count
        

        因为集合具有计数属性。对偶对象集合在大多数时候支持对象或对象列表的 CmdLets 参数中也有效(使用运算符, 构建的集合)。

        PS C:\> (gps AcroRd32) -is [object[]]
        True
        

        只需使用Get-Member cmdlet:

        PS C:\> (gps AcroRd32) | Get-Member
        
           TypeName: System.Diagnostics.Process
        
        Name                       MemberType     Definition
        ----                       ----------     ----------
        Handles                    AliasProperty  Handles = Handlecount
        ...                        ...
        

        PS C:\>  Get-Member -InputObject (gps AcroRd32)
        
           TypeName: System.Object[]
        
        Name           MemberType    Definition
        ----           ----------    ----------
        Count          AliasProperty Count = Length
        ...            ...
        

        【讨论】:

        • Get-Member -InputObject (gps AcroRd32) - 这有助于我了解 Count 属性的来源。现在我可以明白为什么我的“完整语句”不起作用了,因为它是错误的语法。谢谢你教我如何使用(GPS AcroRd32).Count
        【解决方案4】:

        如果您只是在寻找计数,您可以执行以下操作:

        $a = GPS AcroRd32
        $a.Count = 2
        

        $a = GPS AcroRd32 将 $a 设置为进程对象数组。该数组有一个成员调用 Count,它可以让您确定元素的数量。

        Measure-Object 命令行开关(别名为measure)用于测量属性的平均值、最大值、最小值和总和值。因此,您可以执行$a | measure -property Handles -sum 之类的操作并计算打开句柄的总数。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-05-19
          • 2012-01-12
          • 2020-10-12
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多