180 votes

Comment compter les objets dans PowerShell ?

Comme je le lis dans le guide de l'utilisateur de PowerShell, l'un des concepts fondamentaux de PowerShell est que les commandes acceptent et renvoient objets à la place du texte. Ainsi, par exemple, en exécutant get-alias me renvoie un 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 ?

251voto

jumbo Points 1539

Cela vous permettra de compter :

get-alias | measure

Vous pouvez travailler avec le résultat comme avec un 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

Vous trouverez plus d'informations sur la cmdlet Measure-Object sur le site suivant Technet .

Ne le confondez pas avec le cmdlet Measure-Command qui sert à mesurer le temps. (encore une fois sur Technet )

3 votes

J'ai utilisé $Counter = $(get-alias | measure).Count car il renvoie toujours la valeur 1 dans le cas où il n'y a qu'une seule occurrence, comme vous l'avez dit.

7 votes

Une autre option : get-alias | measure | % { $_.Count }

0 votes

Fyi : measure est le diminutif de Measure-Object et renvoie beaucoup d'autres choses, comme par exemple Average , Sum , Maximum etc...

131voto

Michael Sorens Points 9637

Aussi courte que soit la réponse de @jumbo :-) vous pouvez le faire encore plus rapidement. Cela renvoie simplement le Count du tableau retourné par la sous-expression antécédente :

@(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 égale ou supérieure à deux, vous obtiendrez une réponse équivalente avec ou sans @, mais lorsque la réponse est égale à zéro ou un, vous obtiendrez pas de sortie à moins que vous ayez le signe @ ! (Cela force le Count pour exister en forçant la sortie à être un tableau).

Mise à jour 2012.01.30

Ce qui précède est vrai pour PowerShell V2. L'une des nouvelles fonctionnalités de PowerShell V3 est que vous disposez d'une fonction Count même pour les singletons, de sorte que le signe at devient sans importance pour ce scénario.

4 votes

Je sais que c'est vieux, mais pour les autres qui vont chercher ça la v3+ ne semble pas fonctionner sans le @ pour count < 2 if Set-StrictMode -Version Latest est utilisé. J'ai rencontré ce problème aujourd'hui (sur 5.1) - quelque chose qui fonctionnait de manière interactive ne fonctionnait pas dans une fonction. J'ai trouvé que la fonction contenait Set-StrictMode ; lorsque j'ai défini le mode strict de manière interactive, cela n'a pas fonctionné non plus.

0 votes

Bien vu, @vr8ce ! Je suis un fervent défenseur de Set-StrictMode aussi, donc j'aurais dû le remarquer.

1 votes

Pour développer le conseil de @vr8ce, je ne pouvais pas utiliser @($myObject) pour obtenir un compte sur un objet existant. J'utilise donc un if ($myObject.PSobject.Properties.Name -contains "count") (de stackoverflow.com/questions/26997511/ ) avant d'essayer de tester la propriété "count". Je déteste que PoSH me fasse faire cela mais le mode strict en vaut la peine.

27voto

prabhakaran Points 1312

Il suffit d'utiliser des parenthèses et de "compter".

(get-alias).count

1 votes

Cela ne permet pas de répondre à la question. Pour critiquer ou demander des précisions à un auteur, laissez un commentaire sous son article.

0 votes

@Damien OK. J'ai fait la modification. Dans les OS, les gens viennent généralement de la première à la dernière réponse. Ils ne sautent pas soudainement à la troisième réponse et deviennent confus. J'ai donc fait en sorte que la réponse soit une continuation des deux premières réponses. Cette réponse a plus de sens que cette réponse éditée.

1 votes

Ce sujet est déjà abordé dans cette réponse . Vous ne faites que répéter ce qui a déjà été dit, deux ans après que cela ait été dit.

7voto

bchris999 Points 56

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

J'ai trouvé cela avec la cmdlet Get-VmQuestion de VMware :

$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 réponse correcte était 0 comme produit avec la commande Measure méthode).

Cela ne semblait être le cas qu'avec 0 et 1. Tout ce qui était supérieur à 1 était correct avec des tests limités.

0 votes

Chris, je pense que pour obtenir ce que tu voulais, tu devrais faire ceci : @(Get-VmQuestion -VM vm1).count Vous ne pouvez pas forcer la sortie à être un tableau... une fois que la sortie est déjà faite. C'est ce que tu es en train de faire.

1voto

Marco Points 11

Dans mon échange le cmd-let que vous avez présenté n'a pas fonctionné, la réponse était nulle, j'ai donc dû faire une petite correction et cela a bien fonctionné pour moi :

@(get-transportservice | get-messagetrackinglog -Resultsize unlimited -Start "MM/DD/AAAA HH:MM" -End "MM/DD/AAAA HH:MM" -recipients "user@domain.com" | where {$_.Event
ID -eq "DELIVER"}).count

1 votes

Vous avez partagé de bonnes informations sur l'extraction d'informations d'Exchange à l'aide de PowerShell, et vous y avez caché un compte, ce qui en fait une réponse valable, mais pas pour cette question.

0 votes

Si vous regardez attentivement, vous verrez que les 4 réponses donner le @(...).Count la syntaxe.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X