Comment compter les objets dans PowerShell?

140

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 des objets au lieu de texte. Ainsi par exemple, courir get-aliasme renvoie un certain nombre d' System.Management.Automation.AliasInfoobjets:

PS Z: \> get-alias

Définition du nom du type de commande
----------- ---- ----------
Alias% ForEach-Object
Alias? Où-objet
Alias ​​ac Add-Content
Alias ​​asnp Add-PSSnapIn
Chat alias Get-Content
Alias ​​cd Set-Location
Alias ​​chdir Set-Location
...

Maintenant, comment obtenir le nombre de ces objets?

ulidtko
la source

Réponses:

201

Cela vous fera 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

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

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

géant
la source
3
J'ai utilisé $Counter = $(get-alias | measure).Countcar il renvoie toujours la valeur 1 au cas où il n'y aurait qu'une seule occurrence, comme vous l'avez dit.
DarkLite1
6
Une autre option:get-alias | measure | % { $_.Count }
Shameer
fyi: measureest l'abréviation de Measure-Object; et renvoie beaucoup d'autres choses - comme Average, Sum, Maximum, etc ...
BrainSlugs83
1
Pourquoi pas juste (gal) .count? Nécessite PS v3 ou supérieur IIRC. EDIT: cela a déjà été répondu.
uranibaba
4
@Shameer Pendant que nous y sommes, on peut utiliser Get-Alias | Measure-Object | Select-Object -ExpandProperty Countpour se débarrasser de %et {}. Ce qui est plus facile à écrire et à lire est pour une autre discussion.
LosManos
110

Aussi courte que la réponse de @ jumbo soit :-) vous pouvez le faire encore plus laconiquement. Cela renvoie simplement la Countpropriété 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 zéro ou un, vous n'obtiendrez aucune sortie à moins que vous n'ayez le signe @! (Il force la Countpropriété à 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 disposez d'une Countpropriété même pour les singletons, de sorte que le signe arobase devient sans importance pour ce scénario.

Michael Sorens
la source
3
Je sais que c'est vieux, mais pour d'autres qui cherchent ça… v3 + ne semble pas fonctionner sans le @ pour count <2 si Set-StrictMode -Version Latestest utilisé. Je viens de rencontrer ceci aujourd'hui (sur 5.1) - quelque chose fonctionnait de manière interactive qui ne fonctionnait pas dans une fonction. Je l'ai suivi jusqu'à la fonction contenant Set-StrictMode; lorsque je définissais le mode strict de manière interactive, cela ne fonctionnait pas non plus.
vr8ce
Bonne prise, @ vr8ce! Je suis également un fervent défenseur Set-StrictMode, alors j'aurais dû le remarquer.
Michael Sorens
Pour développer les conseils 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.
duct_tape_coder
21

Utilisez simplement des parenthèses et «compte». Cela s'applique à Powershell v3

(get-alias).count
prabhakaran
la source
1
Cela ne répond pas à la question. Pour critiquer ou demander des éclaircissements à un auteur, laissez un commentaire sous sa publication.
Zo a
@Damien OK. J'ai fait le montage. Dans SO les gens viennent généralement de la première réponse à la dernière. Ils ne sauteront pas soudainement dans la troisième réponse et seront confus. Alors que je l'ai fait comme une continuation des deux premières réponses. Cette réponse a plus de sens que celle modifiée.
prabhakaran
1
Ceci est déjà couvert dans cette réponse . Vous ne faites que réitérer ce qui a déjà été dit deux ans après que cela ait été dit.
Liam
1
@Liam Cette réponse est pour PowerShell v2. Ma réponse est pour PowerShell v3. Comme vous l'avez dit, cette réponse est couverte / racontée littéralement dans la mise à jour (2012.01.30 Update) dans cette réponse. Je viens de donner une partie de codage.
prabhakaran
5

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

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

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

La réponse qu'il a donnée est une, alors que

$output

n'a produit aucun résultat (la réponse correcte était 0, telle que produite avec la Measureméthode).

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

bchris999
la source
Chris, je pense que pour obtenir ce que vous vouliez, vous deviez 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 fais.
Daniel Peel