Group-Object în PowerShell

Lucrul cu obiecte Windows PowerShell 1.0

Grupează obiectele care au aceeași valoare la o proprietate și arată câte sunt în fiecare grup.

Sintaxă
Group-Object [[-Property] <Object[]>] [-NoElement] [-AsHashTable] [-AsString] [-CaseSensitive] [-Culture <string>]

Ce face Group-Object

Group-Object (alias group) întoarce câte un obiect GroupInfo pentru fiecare valoare distinctă, cu proprietățile Count (câte elemente), Name (valoarea, ca text) și Group (elementele propriu-zise). Grupurile ies sortate crescător după nume; elementele din grup rămân în ordinea în care au venit.

Fără -Property, obiectele se grupează după valoarea lor (util pentru liste de șiruri). -NoElement păstrează doar numărătoarea, iar -AsHashTable întoarce un hashtable în care cheia este valoarea și valoarea este lista de obiecte, ca să poți accesa rapid un grup: $grupe['Cluj'].

Gruparea textului nu ține cont implicit de majuscule. Din PowerShell 7, -CaseSensitive împreună cu -AsHashTable creează un hashtable cu chei sensibile la majuscule.

Parametri

Parametru Descriere
-Property Proprietatea (sau blocul de script) după care se grupează; pot fi mai multe.
-NoElement Omite coloana Group; rămân doar Count și Name.
-AsHashTable Întoarce un hashtable: cheie = valoarea grupului, valoare = obiectele.
-AsString Cu -AsHashTable, cheile devin șiruri.
-CaseSensitive Grupare care ține cont de majuscule.
-Culture Cultura folosită la compararea textului.

Ce returnează

Obiecte GroupInfo (Count, Name, Group, Values) sau un Hashtable cu -AsHashTable.

Exemple

Exemplul 1: Câte apariții are fiecare oraș

Fără -Property, șirurile se grupează după valoarea lor.

'Iași', 'Cluj', 'Iași', 'Brașov', 'Cluj', 'Iași' | Group-Object

Ieșire în terminal

Count Name                      Group
----- ----                      -----
    1 Brașov                    {Brașov}
    2 Cluj                      {Cluj, Cluj}
    3 Iași                      {Iași, Iași, Iași}

Exemplul 2: Grupare după proprietate, doar cu numărătoarea

-NoElement scoate lista elevilor; sortăm apoi grupurile după Count.

$elevi = @(
    [pscustomobject]@{ Nume = 'Ana'; Oras = 'Iași' }
    [pscustomobject]@{ Nume = 'Mihai'; Oras = 'Cluj' }
    [pscustomobject]@{ Nume = 'Ioana'; Oras = 'Iași' }
    [pscustomobject]@{ Nume = 'Radu'; Oras = 'Brașov' }
    [pscustomobject]@{ Nume = 'Elena'; Oras = 'Cluj' }
    [pscustomobject]@{ Nume = 'Bogdan'; Oras = 'Iași' }
)
$elevi | Group-Object -Property Oras -NoElement | Sort-Object -Property Count -Descending

Ieșire în terminal

Count Name
----- ----
    3 Iași
    2 Cluj
    1 Brașov

Exemplul 3: -AsHashTable: acces direct la un grup

Cheia este orașul; valoarea este lista elevilor din acel oraș.

$elevi = @(
    [pscustomobject]@{ Nume = 'Ana'; Oras = 'Iași' }
    [pscustomobject]@{ Nume = 'Mihai'; Oras = 'Cluj' }
    [pscustomobject]@{ Nume = 'Elena'; Oras = 'Cluj' }
)
$grupe = $elevi | Group-Object -Property Oras -AsHashTable
$grupe['Cluj'].Nume

Ieșire în terminal

Mihai
Elena

Greșeli frecvente

  • Name din rezultat este text, chiar dacă ai grupat după numere: (1..4 | Group-Object { $_ % 2 })[0].Name este '0', nu 0.
  • Coloana Group se trunchiază la afișare pentru grupuri mari; pentru elemente folosește $grup.Group sau -AsHashTable, nu textul afișat.
  • Grupurile nu sunt sortate după mărime: dacă vrei „cele mai frecvente” primele, adaugă | Sort-Object Count -Descending.

Comenzi înrudite

  • Sort-Object: Sortează obiectele după una sau mai multe proprietăți, crescător sau descrescător, opțional doar primele N.
  • Measure-Object: Numără obiectele și calculează suma, media, minimul și maximul unei proprietăți, sau numără rândurile, cuvintele și caracterele unui text.
  • Hashtable (@{}): Un hashtable ține perechi cheie-valoare; [ordered] păstrează ordinea cheilor, iar [pscustomobject] transformă perechile într-un obiect.
  • Select-Object: Alege doar anumite proprietăți ale obiectelor, adaugă proprietăți calculate sau păstrează primele, ultimele ori unicele elemente.
  • Format-Table: Afișează obiectele ca tabel, cu coloanele alese de tine, inclusiv coloane calculate.