2011-09-30 60 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的東西,並獲得打開句柄的總數。

相關問題