Measure-Object în PowerShell

Lucrul cu obiecte Windows PowerShell 1.0

Numără obiectele și calculează suma, media, minimul și maximul unei proprietăți, sau numără rândurile, cuvintele și caracterele unui text.

Sintaxă
Measure-Object [[-Property] <string[]>] [-Sum] [-Average] [-Maximum] [-Minimum] [-StandardDeviation] [-AllStats]
Measure-Object [[-Property] <string[]>] [-Line] [-Word] [-Character] [-IgnoreWhiteSpace]

Ce face Measure-Object

Measure-Object (alias measure) are două moduri. Modul numeric întoarce un obiect GenericMeasureInfo cu Count și, la cerere, Sum, Average, Maximum, Minimum pentru proprietatea dată în -Property. Modul text (-Line, -Word, -Character) întoarce un TextMeasureInfo.

Rezultatul are mai mult de patru proprietăți, așa că se afișează ca listă. De cele mai multe ori ai nevoie de o singură valoare, pe care o iei direct: ($elevi | Measure-Object Nota -Average).Average.

Din PowerShell 6 există -StandardDeviation și -AllStats (toate statisticile deodată), iar proprietatea poate fi un bloc de script. Din 7.3, un obiect fără proprietatea măsurată nu mai produce eroare (decât în Set-StrictMode).

Parametri

Parametru Descriere
-Property Proprietatea măsurată; acceptă wildcard-uri și bloc de script.
-Sum, -Average Suma și media valorilor.
-Maximum, -Minimum Cea mai mare și cea mai mică valoare.
-StandardDeviation Abaterea standard a valorilor (PowerShell 6+).
-AllStats Toate statisticile de mai sus deodată (PowerShell 6+).
-Line, -Word, -Character Numără rândurile, cuvintele și caracterele din șirurile primite.
-IgnoreWhiteSpace Nu numără spațiile la -Character.

Ce returnează

Un obiect GenericMeasureInfo (sau TextMeasureInfo în modul text).

Exemple

Exemplul 1: Statistici pentru note

Câmpurile necerute (aici StandardDeviation) rămân goale.

$elevi = @(
    [pscustomobject]@{ Nume = 'Ana'; Nota = 9 }
    [pscustomobject]@{ Nume = 'Mihai'; Nota = 7 }
    [pscustomobject]@{ Nume = 'Ioana'; Nota = 10 }
    [pscustomobject]@{ Nume = 'Radu'; Nota = 6 }
)
$elevi | Measure-Object -Property Nota -Average -Sum -Maximum -Minimum

Ieșire în terminal

Count             : 4
Average           : 8
Sum               : 32
Maximum           : 10
Minimum           : 6
StandardDeviation :
Property          : Nota

Exemplul 2: Doar numărul de obiecte

Luăm direct proprietatea Count: toți elevii, apoi doar cei cu nota cel puțin 8.

$elevi = @(
    [pscustomobject]@{ Nume = 'Ana'; Nota = 9 }
    [pscustomobject]@{ Nume = 'Mihai'; Nota = 7 }
    [pscustomobject]@{ Nume = 'Ioana'; Nota = 10 }
    [pscustomobject]@{ Nume = 'Radu'; Nota = 6 }
)
($elevi | Measure-Object).Count
($elevi | Where-Object Nota -GE 8 | Measure-Object).Count

Ieșire în terminal

4
2

Exemplul 3: Rânduri, cuvinte și caractere

Fiecare șir este un rând; caracterele includ spațiile (12 + 19 = 31).

'Cafenea Iași', 'deschis zilnic 8-20' | Measure-Object -Line -Word -Character

Ieșire în terminal

Lines Words Characters Property
----- ----- ---------- --------
    2     5         31

Greșeli frecvente

  • Folosirea listei afișate ca valoare: $m = $elevi | Measure-Object Nota -Sum e un obiect; suma este $m.Sum.
  • Lipsa lui -Property pe obiecte: $elevi | Measure-Object -Sum nu adună notele, ci încearcă să adune obiectele însele. Scrie -Property Nota.
  • Media poate avea multe zecimale (de exemplu 8,333…); rotunjește valoarea cu [math]::Round($m.Average, 2) înainte s-o afișezi.

Comenzi înrudite

  • Group-Object: Grupează obiectele care au aceeași valoare la o proprietate și arată câte sunt în fiecare grup.
  • Where-Object: Filtrează obiectele din pipeline și le lasă să treacă doar pe cele care îndeplinesc o condiție.
  • ForEach-Object: Rulează un bloc de cod pentru fiecare obiect din pipeline; din PowerShell 7.0 poate rula blocurile în paralel cu -Parallel.
  • Get-Content: Citește conținutul unui fișier ca listă de linii (sau ca un singur șir cu -Raw); poate afișa primele sau ultimele linii și urmări un log.
  • Import-Csv: Citește un fișier CSV și creează câte un obiect pentru fiecare rând, cu proprietăți numite după coloanele din antet.