script - ¿Cómo contar objetos en PowerShell?
powershell scripting tutorial (4)
Esto te hará contar:
get-alias | measure
Puedes trabajar con el resultado como con el objeto:
$m = get-alias | measure
$m.Count
Y si también desea tener alias en alguna variable, puede usar Tee-Object:
$m = get-alias | tee -Variable aliases | measure
$m.Count
$aliases
Más información sobre el cmdlet Measure-Object está en Technet .
No lo confunda con el cmdlet Measure-Command, que es para medir el tiempo. (otra vez en Technet )
Mientras 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. Entonces, por ejemplo, ejecutar get-alias
me devuelve una cantidad de objetos System.Management.Automation.AliasInfo
:
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 obtengo el recuento de estos objetos?
Solo usa paréntesis y ''cuenta''. Esto se aplica a Powershell v3
(get-alias).count
Tan corto como la respuesta de @ jumbo es :-) puedes hacerlo aún más tersely. Esto solo devuelve la propiedad Count
de la matriz devuelta por la subexpresión de antecedentes:
@(Get-Alias).Count
Un par de puntos a tener en cuenta:
Puede poner una expresión arbitrariamente compleja en lugar de
Get-Alias
, por ejemplo:@(Get-Process | ? { $_.ProcessName -eq "svchost" }).Count
El signo inicial (@) es necesario para una solución robusta. Mientras la respuesta sea dos o más, obtendrás una respuesta equivalente con o sin el @, pero cuando la respuesta sea cero o uno, no obtendrás salida a menos que tengas el signo @. (Obliga a la propiedad
Count
a existir forzando a que la salida sea una matriz).
Actualización 2012.01.30
Lo anterior es cierto para PowerShell V2. Una de las nuevas características de PowerShell V3 es que usted tiene una propiedad Count
incluso para singletons, por lo que el at-sign deja de ser importante para este escenario.
@($output).Count
no siempre produce resultados correctos. ($output | Measure).Count
método ($output | Measure).Count
.
Encontré esto con el cmdlet Get-VmQuestion de VMware:
$output = Get-VmQuestion -VM vm1
@($output).Count
La respuesta que dio fue una, mientras que
$output
no produjo ningún resultado (la respuesta correcta fue 0 como se produjo con el método de Measure
).
Esto solo parecía ser el caso con 0 y 1. Cualquier cosa por encima de 1 era correcta con pruebas limitadas.