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

Sti*_*sfa 6 syntax powershell powershell-2.0

为什么

$a = GPS AcroRd32 | Measure
$a.Count
Run Code Online (Sandbox Code Playgroud)

工作,什么时候

GPS AcroRd32 | Measure -Property Count
Run Code Online (Sandbox Code Playgroud)

不?

第一个示例返回一个值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
Run Code Online (Sandbox Code Playgroud)



这个Scripting Guy条目是我学习如何在第一个代码示例中使用"Count"属性的地方.

第二个代码示例真的令人困惑.在此脚本中心参考中,以下语句有效:

Import-Csv c:\scripts\test.txt | Measure-Object score -ave -max -min
Run Code Online (Sandbox Code Playgroud)

它仍然有效,即使它重写如此:

Import-Csv c:\scripts\test.txt | Measure-Object -ave -max -min -property score
Run Code Online (Sandbox Code Playgroud)

在我考虑Measure-Object帮助页面之前,接受这个问题没有太多问题.状态的参数定义-Property <string[]>:

默认值为对象的Count(Length)属性.

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

GPS AcroRd32 | Measure -Property Count # Fails
Run Code Online (Sandbox Code Playgroud)

以下为我提供了我需要的信息,除了它没有为我提供执行操作的整数,正如您将看到的:

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
Run Code Online (Sandbox Code Playgroud)



那么,为什么Dot Notation($a.count)可以工作,而不是一个明确的语句(GPS | Measure -Property Count)?

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

JNK*_*JNK 6

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

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


Mik*_*ard 5

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

gps AcroRd32 | measure-object | select -expand Count
Run Code Online (Sandbox Code Playgroud)


JPB*_*anc 5

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

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

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

(GPS AcroRd32).count
Run Code Online (Sandbox Code Playgroud)

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

PS C:\> (gps AcroRd32) -is [object[]]
True
Run Code Online (Sandbox Code Playgroud)

只需使用Get-Member cmdlet:

PS C:\> (gps AcroRd32) | Get-Member

   TypeName: System.Diagnostics.Process

Name                       MemberType     Definition
----                       ----------     ----------
Handles                    AliasProperty  Handles = Handlecount
...                        ...
Run Code Online (Sandbox Code Playgroud)

PS C:\>  Get-Member -InputObject (gps AcroRd32)

   TypeName: System.Object[]

Name           MemberType    Definition
----           ----------    ----------
Count          AliasProperty Count = Length
...            ...
Run Code Online (Sandbox Code Playgroud)