2011-09-30 8 views
6

DlaczegoJak korzystać z parametru "-Property" dla polecenia cmdlet programu PowerShell "Measure-Object"?

$a = GPS AcroRd32 | Measure 
$a.Count 

pracy, gdy

GPS AcroRd32 | Measure -Property Count 

nie?

Pierwszy przykład zwraca wartość 2, która jest tym, co chcę, liczbą całkowitą.

Drugi przykład zwraca to:

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 gdzie nauczyłam się korzystać z "Count" obiekt w pierwszej próbki kodu.

Drugi przykładowy kod jest naprawdę mylący. W this Script Center reference, następujące oświadczenie działa:

Import-Csv c:\scripts\test.txt | Measure-Object score -ave -max -min 

on nadal działa, nawet jeśli jest to ponowne napisane tak:

Import-Csv c:\scripts\test.txt | Measure-Object -ave -max -min -property score 

nie mam zbyt wiele problemów z zaakceptowaniem tego momentu uważam Measure-Object help page . Definicja parametru dla -Property <string[]> oznacza:

Domyślną wartością jest właściwość Count (Length) obiektu.

Jeśli domyślną wartością jest Count, czy nie powinno działać jawne przejście od Count?

GPS AcroRd32 | Measure -Property Count # Fails 

Poniżej przedstawiono mi informacje potrzebne, oprócz tego, że nie daje mi liczbę całkowitą do wykonywania operacji na, jak zobaczysz:

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 



Dlaczego więc Dot Notation ($a.count) działa, ale nie jest jednoznacznie napisane oświadczenie (GPS | Measure -Property Count)?

Jeśli mam użyć Dot Notation, to zrobię, ale chciałbym skorzystać z tej okazji, aby dowiedzieć się więcej o jak i * dlaczego PowerShell działa w ten sposób, a nie tylko budowania powierzchowny zrozumienie składni PowerShell. Mówiąc inaczej, chcę uniknąć przekształcenia w Cargo Cult Programmer/Code Monkey.

Odpowiedz

5

Jedna rzecz, którą musisz wiedzieć, to że w PowerShell ogólnie, a szczególnie w CmdLets możesz manipulować obiektami lub kolekcją obiektów.

przykład: Jeżeli tylko jeden „Acrord32” działa Get-Process zwróci [System.Diagnostics.Process], gdy więcej niż jeden z systemu powróci zbiór [System.Diagnostics.Process].

W drugim przypadku można napisać:

(GPS AcroRd32).count 

Ponieważ zbiór ma właściwość Count. Kolekcja obiektów dwoistości jest również poprawna w parametrach CmdLets, które przez większość czasu obsługują obiekty lub listę obiektów (kolekcja zbudowana za pomocą operatora ,).

PS C:\> (gps AcroRd32) -is [object[]] 
True 

Wystarczy użyć Get-Member komandletu:

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

    TypeName: System.Diagnostics.Process 

Name      MemberType  Definition 
----      ----------  ---------- 
Handles     AliasProperty Handles = Handlecount 
...      ... 

I

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

    TypeName: System.Object[] 

Name   MemberType Definition 
----   ---------- ---------- 
Count   AliasProperty Count = Length 
...   ... 
+0

'Get-Member -InputObject (GPS Acrord32)' - to pomogło mi zrozumieć, gdzie 'Count' obiekt pochodzi z. Teraz widzę, dlaczego moje "pełne oświadczenie" nie działa, ponieważ była to niewłaściwa składnia. Dzięki za pokazanie mi, jak używać '(GPS AcroRd32) .Count'! – Stisfa

6

Ponieważ COUNT właściwość jest właściwością OUTPUT obiektu (to wyniki Measure-Object) nie WEJŚCIE obiektu.

Parametr -property określa, które właściwości obiektów wejściowych mają być oceniane. Żadna z nich nie jest COUNT, chyba że przekażesz tablicę lub tablice lub coś takiego.

4

myślę, co chcesz, jest coś takiego:

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

Jeśli szukasz po prostu liczyć można wykonać następujące czynności:

$a = GPS AcroRd32 
$a.Count = 2 

$a = GPS AcroRd32 zestawy $ a do tablicy obiektów procesowych. Tablica ma wywołanie członka, Count, które pozwoli ci określić liczbę elementów już.

Komenda Measure-Object (z aliasem measure) służy do pomiaru wartości średniej, maksymalnej, minimalnej i sumy właściwości. Możesz więc zrobić coś takiego, jak $a | measure -property Handles -sum i zliczyć całkowitą liczbę otwartych uchwytów.

Powiązane problemy