web-dev-qa-db-fra.com

Comment compter des objets dans PowerShell?

Comme je le lis dans le manuel d'utilisation de PowerShell, l'un des concepts fondamentaux de PowerShell est que les commandes acceptent et renvoient des objets au lieu du texte. Ainsi, par exemple, l'exécution de get-alias me renvoie un certain nombre d'objets System.Management.Automation.AliasInfo:

 PS Z: \> get-alias 
 
 Nom du type de commande Définition 
 ----------- ---- ---- ------ 
 Alias% ForEach-Object 
 Alias? Where-Object 
 Alias ​​a 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?

117
ulidtko

Cela vous permettra de compter:

get-alias | measure

Vous pouvez travailler avec le résultat comme avec l'objet:

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

Et si vous souhaitez également avoir des alias dans certaines variables, vous pouvez utiliser Tee-Object:

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

Certaines informations supplémentaires sur l'applet de commande Measure-Object sont activées Technet .

Ne le confondez pas avec l'applet de commande Measure-Command, qui sert à mesurer le temps. (à nouveau sur Technet )

175
jumbo

Aussi bref que la réponse de @ jumbo est :-) vous pouvez le faire encore plus simplement. Cela retourne simplement la propriété Count du tableau renvoyé par la sous-expression antecedent:

@(Get-Alias).Count

Quelques points à noter:

  1. Vous pouvez mettre une expression arbitrairement complexe à la place de Get-Alias, par exemple:

    @(Get-Process | ? { $_.ProcessName -eq "svchost" }).Count
    
  2. Le signe at initial (@) est nécessaire pour une solution robuste. Tant que la réponse est deux ou plus, vous obtiendrez une réponse équivalente avec ou sans le @, mais lorsque la réponse sera 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.)

Mise à jour 2012.01.

Ce qui précède est vrai pour PowerShell V2. L’une des nouvelles fonctionnalités de PowerShell V3 réside dans le fait que vous avez une propriété Count même pour les singletons. Par conséquent, le signe d’attribution devient sans importance pour ce scénario.

99
Michael Sorens

Il suffit d'utiliser la parenthèse et "compter". Ceci s'applique à Powershell v3

(get-alias).count
14
prabhakaran

@($output).Count ne produit pas toujours des résultats corrects. J'ai utilisé la méthode ($output | Measure).Count.

J'ai trouvé cela avec l'applet de commande VMware Get-VmQuestion:

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

La réponse est un, alors que

$output

ne produit aucune sortie (la réponse correcte était 0 telle que produite avec la méthode Measure).

Cela semblait être le cas uniquement avec 0 et 1. Tout ce qui dépassait 1 était correct avec des tests limités.

5
bchris999