为什么
$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。
答案 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
之类的操作,并计算打开句柄的总数。