2012-07-17 27 views
94

Como leo en la guía del usuario de PowerShell, uno de los conceptos básicos de PowerShell es que los comandos aceptan y devuelven objetos en lugar de texto. Así, por ejemplo, yo corriendo get-alias devuelve un número de objetos System.Management.Automation.AliasInfo:¿Cómo contar objetos en PowerShell?

 
PS Z:\> get-alias 

CommandType  Name            Definition 
-----------  ----            ---------- 
Alias   %            ForEach-Object 
Alias   ?            Where-Object 
Alias   ac            Add-Content 
Alias   asnp            Add-PSSnapIn 
Alias   cat            Get-Content 
Alias   cd            Set-Location 
Alias   chdir           Set-Location 
... 

Ahora, ¿Cómo puedo obtener el recuento de estos objetos?

Respuesta

138

Esto te cuente:

get-alias | measure 

se puede trabajar con el resultado como con objeto:

$m = get-alias | measure 
$m.Count 

Y si le gustaría tener alias de alguna variable también, puede use Tee-Object:

$m = get-alias | tee -Variable aliases | measure 
$m.Count 
$aliases 

Más información sobre el cmdlet Measure-Object está activado Technet.

No lo confundas con el cmdlet Measure-Command, que es para medir el tiempo. (nuevamente en Technet)

+3

Utilicé '$ Counter = $ (get-alias | measure) .Count' ya que siempre devuelve el valor 1 en caso de que solo haya una ocurrencia, tal como lo dijiste. – DarkLite1

+4

Otra opción: 'get-alias | medida | % {$ _. Count} ' – Shameer

+0

fyi:' measure' es la abreviatura de 'Measure-Object'; y devuelve muchas otras cosas, como 'promedio',' suma', 'máximo', etc ... – BrainSlugs83

83

Tan corto como la respuesta de @ jumbo es :-) puedes hacerlo aún más concisamente. Esto sólo devuelve la propiedad Count de la matriz devuelta por el antecedente sub-expresión:

@(Get-Alias).Count 

Un par de puntos a tener en cuenta:

  1. Se puede retener una expresión arbitrariamente compleja en lugar de Get-Alias, por ejemplo:

    @(Get-Process | ? { $_.ProcessName -eq "svchost" }).Count 
    
  2. El inicial en-signo (@) es necesario para una solución robusta. Mientras la respuesta sea dos o más, obtendrá una respuesta equivalente con o sin el símbolo @, pero cuando la respuesta sea cero o uno obtendrá sin salida a menos que tenga el signo @. (Obliga la propiedad Count de existir forzando la salida sea una matriz.)

2012.01.30 actualización

lo anterior es cierto para PowerShell V2. Una de las nuevas características de PowerShell V3 es que tiene una propiedad Count incluso para singletons, por lo que el signo a no es importante para este escenario.

+7

¡Gracias @msorens por resaltar el uso '@' aquí para obtener una salida! – Rama

+2

Sé que esto es viejo, pero para otros que busquen esto ... v3 + no parece funcionar sin @ para contar <2 si se usa 'Set-StrictMode -Version Latest'. Me encontré con esto hoy (en 5.1) - algo funcionó de manera interactiva que no funcionó en una función. Lo rastreé hasta la función que tiene Set-StrictMode en él; cuando establecí el modo estricto interactivamente, tampoco funcionó. – vr8ce

+0

¡Buena captura, @ vr8ce! También soy un fuerte defensor de 'Set-StrictMode', así que debería haberlo notado. –

11

Solo usa paréntesis y 'cuenta'. Esto se aplica a Powershell v3

(get-alias).count 
+0

Esto no proporciona una respuesta a la pregunta. Para criticar o solicitar aclaraciones de un autor, deje un comentario debajo de su publicación. –

+0

@Damien OK. Hice la edición. En SO, la gente generalmente viene desde la primera respuesta hasta la última. De repente no saltan a la tercera respuesta y se confunden. Entonces lo hice como una continuación de las primeras dos respuestas. Esa respuesta tiene más sentido que esta editada. – prabhakaran

1

@($output).Count no siempre produce resultados correctos. Utilicé el método ($output | Measure).Count.

yo encontramos este con VMware Get-VmQuestion cmdlet:

$output = Get-VmQuestion -VM vm1 
@($output).Count 

La respuesta dada es uno, mientras que

$output 

producido ninguna salida (la respuesta correcta era 0 como se produce con la Measure método).

Esto solo parecía ser el caso con 0 y 1. Cualquier cosa superior a 1 era correcta con pruebas limitadas.

+0

Chris, creo que para obtener lo que querías, necesitarías hacer esto: @ (Get-VmQuestion -VM vm1) .count No puedes forzar que la salida sea una matriz ... una vez que la salida ya está hecho. Que es lo que estás haciendo. –

Cuestiones relacionadas