如何使用PowerShell的“Measure-Object”cmdlet的“-Property”参数?

时间:2011-09-30 18:44:14

标签: powershell syntax powershell-v2.0

为什么

$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是我学习如何在第一个代码示例中使用“Count”属性的地方。

第二个代码示例确实令人困惑。在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 <string[]>的参数定义指出:

  

默认值是对象的Count(Length)属性。

如果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



那么,为什么Dot Notation($a.count)有效,但没有明确的书面陈述(GPS | Measure -Property Count)?

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

4 个答案:

答案 0 :(得分:6)

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

-property参数指定要评估输入对象的哪些属性。除非您传递数组或数组或其他内容,否则这些都不是COUNT

答案 1 :(得分:5)

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

gps AcroRd32 | measure-object | select -expand Count

答案 2 :(得分:5)

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

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

在第二种情况下,你可以写:

(GPS AcroRd32).count

因为集合具有count属性。对偶对象集合在CmdLets参数中也有效,大多数情况下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
...            ...

答案 3 :(得分:2)

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

$a = GPS AcroRd32
$a.Count = 2

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

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