2011-09-30 23 views
6

¿Por quéCómo usar el parámetro "-Property" para el cmdlet "Measure-Object" de PowerShell?

$a = GPS AcroRd32 | Measure 
$a.Count 

trabajo, cuando

GPS AcroRd32 | Measure -Property Count 

no?

El primer ejemplo devuelve un valor de 2, que es lo que quiero, un número entero.

El segundo ejemplo devuelve lo siguiente:

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 es donde aprendí cómo utilizar el "Count" Propiedad en el primer ejemplo de código.

El segundo ejemplo de código es realmente confuso. En this Script Center reference, la siguiente afirmación funciona:

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

Todavía funciona incluso si es re-escrito así:

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

no tengo demasiados problemas con aceptar esto hasta que considero la Measure-Object help page . La definición de parámetros para -Property <string[]> afirma:

El valor por defecto es el conde (longitud) propiedad del objeto.

Si Count es el valor predeterminado, entonces no debería un pase explícita de Count trabajo?

GPS AcroRd32 | Measure -Property Count # Fails 

El siguiente me proporciona la información que necesito, excepto que no me proporciona con un entero para realizar operaciones en, como se verá:

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 



Así que, ¿por qué punto la notación ($a.count) de trabajo, pero no una declaración escrita de forma explícita (GPS | Measure -Property Count)?

Si se supone que debo utilizar la notación de puntos, entonces lo haré, pero me gustaría aprovechar esta oportunidad para aprender más sobre cómo y * qué PowerShell funciona de esta manera, en lugar de sólo la construcción de un somero comprensión de la sintaxis de PowerShell. Para decirlo de otra manera, quiero evitar convertirme en un Cargo Cult Programmer/Code Monkey.

Respuesta

5

Una cosa que debe saber es que en PowerShell en general, y en particular en CmdLets, manipula objetos o colección de objetos.

Ejemplo: si solo se ejecuta 'AcroRd32' Get-Process devolverá [System.Diagnostics.Process]; si hay más de uno ejecutándose, se devolverá una colección de [System.Diagnostics.Process].

En el segundo caso, se puede escribir:

(GPS AcroRd32).count 

Debido a una colección tiene una propiedad de recuento. La colección de objetos de dualidad también es válida en los parámetros de CmdLets que la mayoría de las veces admiten objetos o una lista de objetos (colección creada con el operador ,).

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

sólo tiene que utilizar el cmdlet Get-Member:

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

    TypeName: System.Diagnostics.Process 

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

Y

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

    TypeName: System.Object[] 

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

'Get-Member -InputObject (GPS Acrord32)' - esto me ayudó a entender que el 'Propiedad Count' vino de. Ahora puedo ver por qué mi "declaración completa" no funciona, ya que era la sintaxis incorrecta. Gracias por mostrarme cómo usar '(GPS AcroRd32) .Count'! – Stisfa

6

Dado que la propiedad COUNT es una propiedad de la OUTPUT objeto (es decir, resultados de Measure-Object), no el ENTRADA objeto.

El parámetro -property especifica qué propiedad (es) de los objetos de entrada se van a evaluar. Ninguno de estos es COUNT a menos que pase una matriz o matrices o algo.

4

Creo que lo que quiere es algo como esto:

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

Si usted está buscando para el recuento se puede hacer lo siguiente:

$a = GPS AcroRd32 
$a.Count = 2 

$a = GPS AcroRd32 asigna a $ a una matriz de objetos de proceso La matriz tiene una llamada de miembro, Count, que le permitirá determinar la cantidad de elementos que ya tiene.

El comando Measure-Object (con el alias measure) se utiliza para medir los valores promedio, máximo, mínimo y suma de una propiedad. Entonces podría hacer algo como $a | measure -property Handles -sum y obtener un recuento de la cantidad total de manijas abiertas.

Cuestiones relacionadas