Comment compter les objets dans PowerShell?
Comme je le lis dans le guide de L'utilisateur PowerShell, L'un des concepts de base de PowerShell est que les commandes acceptent et renvoient objets au lieu de texte. Ainsi, par exemple, l'exécution de get-alias
me renvoie un certain nombre de System.Management.Automation.AliasInfo
objets:
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 ...
Maintenant, comment puis-je obtenir le nombre de ces objets?
4 réponses
Cela vous permettra de compter:
get-alias | measure
, Vous pouvez travailler avec le résultat qu'avec l'objet:
$m = get-alias | measure
$m.Count
Et si vous souhaitez également avoir des alias dans une variable, vous pouvez utiliser Tee-Object:
$m = get-alias | tee -Variable aliases | measure
$m.Count
$aliases
Quelques informations supplémentaires sur la cmdlet Measure-Object sont sur Technet .
Ne le confondez pas avec L'applet de commande Measure-Command qui sert à mesurer le temps. (de nouveau sur Technet)
Aussi courte que la réponse de @jumbo est : -) vous pouvez le faire encore plus laconiquement.
Cela renvoie simplement la propriété Count
du tableau retourné par la sous-expression antécédente:
@(Get-Alias).Count
Quelques points à noter:
-
Vous pouvez mettre une expression arbitrairement complexe à la place de
Get-Alias
, par exemple:@(Get-Process | ? { $_.ProcessName -eq "svchost" }).Count
La première arobase (@) est nécessaire pour une solution solide. Tant que la réponse est deux ou plus vous obtiendrez une réponse équivalente avec ou sans le @, mais quand la réponse est zéro ou un, vous obtiendrez non sortie, sauf si vous avez le signe@! (Cela force la propriété
Count
à exister en forçant la sortie à être un tableau.)
2012.01.30 mise à Jour
Ce qui précède est vrai pour PowerShell V2. L'une des nouvelles fonctionnalités de PowerShell V3 est que vous avez une propriété Count
même pour les singletons, de sorte que le signe at devient sans importance pour ce scénario.
Utilisez simplement les parenthèses et 'count'. Ceci s'applique à Powershell v3
(get-alias).count
@($output).Count
ne produit pas toujours des résultats corrects.
J'ai utilisé la méthode ($output | Measure).Count
.
J'ai trouvé cela avec VMware Get-vmquestion cmdlet:
$output = Get-VmQuestion -VM vm1
@($output).Count
La réponse qu'il a donnée est une, alors que
$output
N'a produit aucune sortie (la bonne réponse était 0 comme produite avec la méthode Measure
).
Cela ne semblait être le cas que pour 0 et 1. Tout ce qui précède 1 était correct avec des tests limités.