Come contare gli oggetti in PowerShell?


140

Mentre sto leggendo nella guida per l'utente di PowerShell, uno dei concetti chiave di PowerShell è che i comandi accettano e ritornano oggetti anziché testo. Quindi, ad esempio, l'esecuzione get-aliasmi restituisce un numero di System.Management.Automation.AliasInfooggetti:

PS Z: \> get-alias

CommandType Nome Definizione
----------- ---- ----------
Alias% per ogni oggetto
Alias? Where-Object
Alias ​​ac Add-Content
Alias ​​asnp Add-PSSnapIn
Alias ​​cat Get-Content
Alias ​​cd Set-Location
Alias ​​chdir Set-Location
...

Ora, come posso ottenere il conteggio di questi oggetti?

Risposte:


201

Questo ti farà contare:

get-alias | measure

Puoi lavorare con il risultato come con oggetto:

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

E se desideri avere alias anche in alcune variabili, puoi usare Tee-Object:

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

Altre informazioni sul cmdlet Measure-Object sono su Technet .

Non confonderlo con il cmdlet Measure-Command per la misurazione del tempo. (di nuovo su Technet )


3
Ho usato $Counter = $(get-alias | measure).Countin quanto restituisce sempre il valore 1 nel caso in cui si verifichi una sola occorrenza, proprio come hai detto.
DarkLite1

6
Un'altra opzione:get-alias | measure | % { $_.Count }
Shameer,

fyi: measureè l'abbreviazione di Measure-Object; e restituisce un sacco di altre cose - come Average, Sum, Maximum, ecc ...
BrainSlugs83

1
Perché non solo (gal) .count? Richiede IIRC PS v3 o superiore. EDIT: questo è già stato risposto.
Uranibaba,

4
@Shameer Mentre ci siamo, uno può usare Get-Alias | Measure-Object | Select-Object -ExpandProperty Countper sbarazzarsi di %e {}. Ciò che è più facile da scrivere e leggere è per un'altra discussione.
LosManos

110

La risposta di @ jumbo è breve :-), puoi farlo ancora più rapidamente. Ciò restituisce solo la Countproprietà dell'array restituito dalla sottoespressione antecedente:

@(Get-Alias).Count

Un paio di punti da notare:

  1. È possibile inserire un'espressione arbitrariamente complessa al posto di Get-Alias, ad esempio:

    @(Get-Process | ? { $_.ProcessName -eq "svchost" }).Count
  2. Il segno iniziale iniziale (@) è necessario per una soluzione solida. Finché la risposta è due o maggiore otterrai una risposta equivalente con o senza @, ma quando la risposta è zero o una non otterrai alcun output a meno che tu non abbia il segno @! (Forza la Countproprietà a esistere forzando l'output in un array.)

Aggiornamento 2012.01.30

Quanto sopra vale per PowerShell V2. Una delle nuove funzionalità di PowerShell V3 è che hai una Countproprietà anche per i singoli, quindi il segno di at diventa irrilevante per questo scenario.


3
So che questo è vecchio, ma per gli altri che cercano questo ... v3 + non sembra funzionare senza @ per conteggio <2 se Set-StrictMode -Version Latestviene utilizzato. Mi sono appena imbattuto in questo oggi (su 5.1) - qualcosa ha funzionato in modo interattivo che non ha funzionato in una funzione. L'ho rintracciato fino alla funzione che ha Set-StrictMode in esso; quando ho impostato la modalità rigorosa in modo interattivo, non ha funzionato neanche.
vr8ce,

Buona cattura, @ vr8ce! Anch'io sono un forte sostenitore di Set-StrictMode, quindi avrei dovuto notarlo.
Michael Sorens,

Per espandere il consiglio di @ vr8ce, non ho potuto usare @ ($ myObject) per ottenere un conteggio su un oggetto esistente. Quindi uso un if ($myObject.PSobject.Properties.Name -contains "count")(da stackoverflow.com/questions/26997511/… ) prima di provare a testare la proprietà count. Odio il fatto che PoSH mi faccia fare questo, ma ne vale la pena.
duct_tape_coder il

21

Usa solo la parentesi e 'conta'. Questo vale per Powershell v3

(get-alias).count

1
Questo non fornisce una risposta alla domanda. Per criticare o richiedere chiarimenti a un autore, lascia un commento sotto il suo post.
Zo ha il

@Damien OK. Ho fatto la modifica. In SO le persone generalmente arrivano dalla prima risposta all'ultima. Non saltano improvvisamente nella terza risposta e si confondono. In modo che l'ho fatto come una continuazione delle prime due risposte. Questa risposta ha più senso di questa modificata.
prabhakaran,

1
Questo è già trattato in questa risposta . Fondamentalmente stai solo ripetendo ciò che è già stato detto due anni dopo che è stato detto.
Liam,

1
@Liam Questa risposta è per PowerShell v2. La mia risposta è per PowerShell v3. Come hai detto, questa risposta è coperta / raccontata letteralmente nell'aggiornamento (Aggiornamento del 30.01.2012) in quella risposta. Ho appena dato una parte di programmazione.
prabhakaran,

5

@($output).Countnon produce sempre risultati corretti. Ho usato il ($output | Measure).Countmetodo

Ho trovato questo con il cmdlet VMware Get-VmQuestion:

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

La risposta che ha dato è una, mentre

$output

non ha prodotto output (la risposta corretta era 0 come prodotta con il Measuremetodo).

Questo sembrava essere solo il caso di 0 e 1. Qualsiasi cosa sopra 1 era corretta con test limitati.


Chris, penso di ottenere quello che volevi che avresti bisogno di fare questo: @ (Get-VmQuestion -VM vm1) .count Non puoi forzare l'output ad essere un array ... una volta che l'output è già stato creato . Questo è quello che stai facendo.
Daniel Peel,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.