Sort-Object în PowerShell

Lucrul cu obiecte Windows PowerShell 1.0

Sortează obiectele după una sau mai multe proprietăți, crescător sau descrescător, opțional doar primele N.

Sintaxă
Sort-Object [[-Property] <Object[]>] [-Descending] [-Unique] [-Top <int>] [-Bottom <int>] [-Stable] [-CaseSensitive] [-Culture <string>]

Ce face Sort-Object

Sort-Object adună toate obiectele primite și le trimite mai departe în ordine. Fără -Property folosește proprietățile implicite de sortare ale tipului sau compară obiectele direct (util pentru numere și șiruri). Implicit, sortarea textului nu ține cont de majuscule; -CaseSensitive schimbă asta.

Pentru mai multe criterii scrii proprietățile separate prin virgulă. Dacă vrei ordini diferite pe fiecare criteriu, folosești hashtable-uri: @{ Expression = 'Nota'; Descending = $true }. Proprietatea poate fi și un bloc de script, de exemplu { [int]$_ }, pentru a sorta text ca numere.

Din PowerShell 6.0 există -Top și -Bottom (primele / ultimele N după sortare), iar din 6.2 -Stable, care păstrează ordinea inițială a elementelor egale. Aliasul sort există doar pe Windows; pe macOS și Linux sort pornește utilitarul de sistem.

Parametri

Parametru Descriere
-Property Proprietăți, blocuri de script sau hashtable-uri cu Expression și Ascending/Descending.
-Descending Ordine descrescătoare pentru toate criteriile.
-Unique Elimină duplicatele după sortare; nu ține cont de majuscule.
-Top / -Bottom Întoarce doar primele / ultimele N obiecte sortate; sortare stabilă (PowerShell 6.0+).
-Stable Elementele egale rămân în ordinea în care au venit (PowerShell 6.2+).
-CaseSensitive Sortare care ține cont de majuscule.
-Culture Cultura folosită la compararea textului (de exemplu ro-RO).

Ce returnează

Aceleași obiecte, în ordinea cerută.

Exemple

Exemplul 1: Primii trei elevi după notă, cu -Top

Elena și Bogdan au aceeași notă; -Top face o sortare stabilă, așa că Elena, venită prima, rămâne înaintea lui Bogdan.

$elevi = @(
    [pscustomobject]@{ Nume = 'Ana'; Oras = 'Iași'; Nota = 9 }
    [pscustomobject]@{ Nume = 'Mihai'; Oras = 'Cluj'; Nota = 7 }
    [pscustomobject]@{ Nume = 'Ioana'; Oras = 'Iași'; Nota = 10 }
    [pscustomobject]@{ Nume = 'Elena'; Oras = 'Cluj'; Nota = 8 }
    [pscustomobject]@{ Nume = 'Bogdan'; Oras = 'Iași'; Nota = 8 }
)
$elevi | Sort-Object -Property Nota -Descending -Top 3

Ieșire în terminal

Nume  Oras Nota
----  ---- ----
Ioana Iași   10
Ana   Iași    9
Elena Cluj    8

Exemplul 2: Două criterii: oraș crescător, notă descrescătoare

Al doilea criteriu este un hashtable cu Descending = $true; primul rămâne crescător.

$elevi = @(
    [pscustomobject]@{ Nume = 'Ana'; Oras = 'Iași'; Nota = 9 }
    [pscustomobject]@{ Nume = 'Mihai'; Oras = 'Cluj'; Nota = 7 }
    [pscustomobject]@{ Nume = 'Ioana'; Oras = 'Iași'; Nota = 10 }
    [pscustomobject]@{ Nume = 'Elena'; Oras = 'Cluj'; Nota = 8 }
    [pscustomobject]@{ Nume = 'Bogdan'; Oras = 'Iași'; Nota = 8 }
)
$elevi | Sort-Object -Property Oras, @{ Expression = 'Nota'; Descending = $true }

Ieșire în terminal

Nume   Oras Nota
----   ---- ----
Elena  Cluj    8
Mihai  Cluj    7
Ioana  Iași   10
Ana    Iași    9
Bogdan Iași    8

Exemplul 3: Text care arată ca numere

Șirurile se sortează caracter cu caracter („10” înainte de „9”); cu { [int]$_ } se sortează ca numere.

$coduri = '10', '9', '100'
($coduri | Sort-Object) -join ', '
($coduri | Sort-Object { [int]$_ }) -join ', '

Ieșire în terminal

10, 100, 9
9, 10, 100

Greșeli frecvente

  • Sort-Object Nota -Descending | Select-Object -First 3 nu garantează ordinea între elementele egale; -Top 3 sau -Stable o păstrează.
  • -Descending se aplică tuturor proprietăților. Pentru ordini amestecate folosește hashtable-uri cu Descending / Ascending pe fiecare criteriu.
  • Pe macOS și Linux, sort nu este alias pentru Sort-Object, ci programul /usr/bin/sort, care primește text, nu obiecte. Scrie numele complet al cmdlet-ului în scripturi.

Comenzi înrudite

  • Select-Object: Alege doar anumite proprietăți ale obiectelor, adaugă proprietăți calculate sau păstrează primele, ultimele ori unicele elemente.
  • 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.
  • 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.
  • PowerShell pe macOS și Linux: Cum instalezi și pornești PowerShell 7 (pwsh) pe macOS și Linux și ce se comportă diferit față de Windows: aliasuri, majuscule, căi.