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?

103
demandé sur ulidtko 2012-07-17 19:52:28

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)

154
répondu jumbo 2012-07-17 16:05:05

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:

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

    @(Get-Process | ? { $_.ProcessName -eq "svchost" }).Count
    
  2. 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.

90
répondu Michael Sorens 2013-03-05 16:25:19

Utilisez simplement les parenthèses et 'count'. Ceci s'applique à Powershell v3

(get-alias).count
11
répondu prabhakaran 2015-08-13 07:34:20

@($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.

1
répondu bchris999 2015-07-21 14:44:45