Wie zähle ich Objekte in PowerShell?

139

Wie ich im PowerShell-Benutzerhandbuch lese, besteht eines der wichtigsten PowerShell-Konzepte darin, dass Befehle Objekte anstelle von Text akzeptieren und zurückgeben . get-aliasWenn ich zum Beispiel laufe, bekomme ich eine Reihe von System.Management.Automation.AliasInfoObjekten zurück:

PS Z: \> get-alias

CommandType Name Definition
----------- ---- ----------
Alias% ForEach-Object
Alias ​​? Wo-Objekt
Alias ​​ac Add-Content
Alias ​​asnp Add-PSSnapIn
Alias ​​Katze Get-Content
Alias ​​cd Set-Location
Alias ​​chdir Set-Location
...

Nun, wie bekomme ich die Zählung dieser Objekte?

ulidtko
quelle

Antworten:

200

Damit zählen Sie:

get-alias | measure

Sie können mit dem Ergebnis wie mit dem Objekt arbeiten:

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

Und wenn Sie auch Aliase in einer Variablen haben möchten, können Sie Tee-Object verwenden:

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

Weitere Informationen zum Cmdlet Measure-Object finden Sie unter Technet .

Verwechseln Sie es nicht mit dem Cmdlet Measure-Command, das zur Zeitmessung dient. (wieder auf Technet )

Jumbo
quelle
3
Ich habe verwendet, $Counter = $(get-alias | measure).Countda es immer den Wert 1 zurückgibt, falls es nur ein Vorkommen gibt, genau wie Sie gesagt haben.
DarkLite1
6
Eine weitere Option:get-alias | measure | % { $_.Count }
Shameer
fyi: measureist die Abkürzung für Measure-Object; und gibt eine Menge anderer Sachen - wie Average, Sum, Maximumusw ...
BrainSlugs83
1
Warum nicht einfach (gal) .count? Benötigt PS v3 oder höher IIRC. EDIT: Dies wurde bereits beantwortet.
Uranibaba
3
@Shameer Während wir gerade dabei sind, kann man verwenden Get-Alias | Measure-Object | Select-Object -ExpandProperty Countloswerden zu %und {}. Was einfacher zu schreiben und zu lesen ist, ist für eine andere Diskussion.
LosManos
109

So kurz wie @ jumbos Antwort lautet :-) Sie können es noch knapper machen. Dies gibt nur die CountEigenschaft des Arrays zurück, das vom vorangegangenen Unterausdruck zurückgegeben wird:

@(Get-Alias).Count

Ein paar Punkte zu beachten:

  1. Sie können einen beliebig komplexen Ausdruck anstelle von Get-Aliasbeispielsweise setzen:

    @(Get-Process | ? { $_.ProcessName -eq "svchost" }).Count
  2. Das anfängliche Vorzeichen (@) ist für eine robuste Lösung erforderlich . Solange die Antwort zwei oder mehr ist, erhalten Sie eine äquivalente Antwort mit oder ohne @, aber wenn die Antwort null oder eins ist, erhalten Sie keine Ausgabe, es sei denn, Sie haben das @ -Zeichen! (Erzwingt das Vorhandensein der CountEigenschaft, indem die Ausgabe als Array erzwungen wird.)

2012.01.30 Update

Dies gilt für PowerShell V2. Eine der neuen Funktionen von PowerShell V3 besteht darin, dass Sie Countselbst für Singletons eine Eigenschaft haben , sodass das At-Sign für dieses Szenario unwichtig wird.

Michael Sorens
quelle
3
Ich weiß, dass dies alt ist, aber für andere, die danach suchen ... scheint v3 + ohne das @ für count <2 nicht zu funktionieren, wenn Set-StrictMode -Version Latestes verwendet wird. Ich bin heute (auf 5.1) darauf gestoßen - etwas, das interaktiv funktioniert hat und in einer Funktion nicht funktioniert hat. Ich habe es auf die Funktion zurückverfolgt, in der Set-StrictMode enthalten ist. Wenn ich den strengen Modus interaktiv eingestellt habe, hat es auch nicht funktioniert.
vr8ce
Guter Fang, @ vr8ce! Ich bin auch ein starker Befürworter von Set-StrictMode, also hätte ich das bemerken sollen.
Michael Sorens
Um den Rat von @ vr8ce zu erweitern, konnte ich @ ($ myObject) nicht verwenden, um eine Zählung für ein vorhandenes Objekt zu erhalten. Daher verwende ich eine if ($myObject.PSobject.Properties.Name -contains "count")(von stackoverflow.com/questions/26997511/… ), bevor ich versuche, die count-Eigenschaft zu testen. Ich hasse es, dass PoSH mich dazu bringt, aber der strikte Modus ist es wert.
duct_tape_coder
21

Verwenden Sie einfach Klammern und 'zählen'. Dies gilt für Powershell v3

(get-alias).count
Prabhakaran
quelle
1
Dies gibt keine Antwort auf die Frage. Um einen Autor zu kritisieren oder um Klärung zu bitten, hinterlassen Sie einen Kommentar unter seinem Beitrag.
Zo hat
@ Damien OK. Ich habe die Bearbeitung vorgenommen. In SO kommen die Leute im Allgemeinen von der ersten bis zur letzten Antwort. Sie werden nicht plötzlich in die dritte Antwort springen und verwirrt werden. Damit habe ich es als Fortsetzung der ersten beiden Antworten gemacht. Diese Antwort ist sinnvoller als diese bearbeitete.
Prabhakaran
1
Dies wird bereits in dieser Antwort behandelt . Sie wiederholen im Grunde nur, was bereits zwei Jahre nach dem Gesagten gesagt wurde.
Liam
1
@ Liam Diese Antwort ist für Powershell v2. Meine Antwort ist für Powershell v3. Wie Sie sagten, wird diese Antwort im Update (30.01.2012) in dieser Antwort wörtlich behandelt. Ich habe gerade Codierungsteil gegeben.
Prabhakaran
5

@($output).Countführt nicht immer zu korrekten Ergebnissen. Ich habe die ($output | Measure).CountMethode angewendet .

Ich habe dies mit dem Cmdlet VMware Get-VmQuestion gefunden:

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

Die Antwort, die es gab, ist eine, während

$output

erzeugte keine Ausgabe (die richtige Antwort war 0, wie mit der MeasureMethode erzeugt).

Dies schien nur bei 0 und 1 der Fall zu sein. Alles über 1 war mit begrenzten Tests korrekt.

bchris999
quelle
Chris, ich denke, um herauszufinden, was Sie wollten, müssten Sie dies tun: @ (Get-VmQuestion -VM vm1) .count Sie können die Ausgabe nicht als Array erzwingen ... sobald die Ausgabe bereits erfolgt ist . Welches ist, was Sie tun.
Daniel Peel