2011-09-30 62 views
6

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

$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 <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)?

如果我应该使用点表示法,那么我会的,但我想借此机会更多地了解如何 * 为什么 PowerShell中以这种方式工作,而不是只建立一个敷衍了解PowerShell的语法。换句话说,我想避免变成Cargo Cult Programmer/Code Monkey

回答

5

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

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

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

(GPS AcroRd32).count 

因为集合有一个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 
...   ... 
+0

'获取会员-InputObject(GPS AcroRd32)' - 这帮助我了解其中'Count'物业来自。现在我明白了为什么我的“完整声明”不起作用,因为它是错误的语法。感谢您向我展示如何使用'(GPS AcroRd32).Count'! – Stisfa

6

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

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

4

我想你想要的是这样的:

gps AcroRd32 | measure-object | select -expand Count 
2

如果你只是想找你可以做以下的计数:

$a = GPS AcroRd32 
$a.Count = 2 

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

Measure-Object commandlet(别名measure)用于测量属性的平均值,最大值,最小值和总和值。所以你可以做一些类似于$a | measure -property Handles -sum的东西,并获得打开句柄的总数。

相关问题