如何为PowerShell的“Measure-Object”cmdlet使用“-Property”参数?
为什么如何为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。
你需要知道的一件事是,在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
... ...
由于COUNT
属性是OUTPUT对象的性质(即Measure-Object
结果),而不是INPUT对象。
-property
参数指定要评估输入对象的哪些属性。除非你传递数组或数组,否则这些都不是COUNT
。
我想你想要的是这样的:
gps AcroRd32 | measure-object | select -expand Count
如果你只是想找你可以做以下的计数:
$a = GPS AcroRd32
$a.Count = 2
$a = GPS AcroRd32
将$ a的数组的过程对象。该数组有一个成员调用Count,它将允许您确定已经有的元素数量。
Measure-Object commandlet(别名measure
)用于测量属性的平均值,最大值,最小值和总和值。所以你可以做一些类似于$a | measure -property Handles -sum
的东西,并获得打开句柄的总数。
'获取会员-InputObject(GPS AcroRd32)' - 这帮助我了解其中'Count'物业来自。现在我明白了为什么我的“完整声明”不起作用,因为它是错误的语法。感谢您向我展示如何使用'(GPS AcroRd32).Count'! – Stisfa