Select-Object în PowerShell

Lucrul cu obiecte Windows PowerShell 1.0

Alege doar anumite proprietăți ale obiectelor, adaugă proprietăți calculate sau păstrează primele, ultimele ori unicele elemente.

Sintaxă
Select-Object [[-Property] <Object[]>] [-ExpandProperty <string>] [-First <int>] [-Last <int>] [-Skip <int>] [-Unique]

Ce face Select-Object

Select-Object (alias select) face două lucruri diferite. Cu -Property creează obiecte noi care au doar proprietățile cerute, în ordinea cerută. Cu -First, -Last, -Skip, -Index sau -Unique alege obiecte întregi dintr-o colecție, fără să le schimbe.

O proprietate calculată se scrie ca hashtable cu cheile Name (sau Label) și Expression; în bloc, $_ este obiectul curent. -ExpandProperty întoarce chiar valorile proprietății (șiruri, numere), nu obiecte cu o singură coloană, ceea ce e util când vrei o listă simplă de nume.

Când folosești -First sau -Index, PowerShell oprește comanda din stânga imediat ce a primit destule obiecte (optimizare din Windows PowerShell 3.0; -Wait o dezactivează). Din PowerShell 7.4, -CaseInsensitive face -Unique să nu mai țină cont de majuscule.

Parametri

Parametru Descriere
-Property Proprietățile păstrate; acceptă wildcard-uri și proprietăți calculate @{ Name = '...'; Expression = { ... } }.
-ExpandProperty Întoarce valorile unei singure proprietăți (dacă e tablou, fiecare element separat).
-ExcludeProperty Proprietăți eliminate din rezultat; din PowerShell 6 merge și fără -Property.
-First / -Last Primele sau ultimele N obiecte.
-Skip / -SkipLast Sare peste primele N (sau ultimele N) obiecte.
-Index Alege obiectele de pe pozițiile date (numerotare de la 0).
-Unique Păstrează o singură apariție din obiectele identice; sensibil la majuscule.
-CaseInsensitive Cu -Unique, compară fără să țină cont de majuscule (PowerShell 7.4+).

Ce returnează

Obiecte noi (PSCustomObject) cu proprietățile alese, obiectele originale (la -First, -Unique etc.) sau valorile brute (la -ExpandProperty).

Exemple

Exemplul 1: Doar câteva coloane și primele două rânduri

Obiectele au trei proprietăți; păstrăm numele și nota pentru primii doi elevi.

$elevi = @(
    [pscustomobject]@{ Nume = 'Ana'; Oras = 'Iași'; Nota = 9 }
    [pscustomobject]@{ Nume = 'Mihai'; Oras = 'Cluj'; Nota = 7 }
    [pscustomobject]@{ Nume = 'Ioana'; Oras = 'Iași'; Nota = 10 }
)
$elevi | Select-Object -Property Nume, Nota -First 2

Ieșire în terminal

Nume  Nota
----  ----
Ana      9
Mihai    7

Exemplul 2: Proprietate calculată: totalul unei comenzi

Coloana „Total (lei)” nu există în date; o calculăm din preț și cantitate.

$produse = @(
    [pscustomobject]@{ Produs = 'Cafea'; Pret = 25; Cantitate = 4 }
    [pscustomobject]@{ Produs = 'Ceai'; Pret = 12; Cantitate = 10 }
    [pscustomobject]@{ Produs = 'Prăjitură'; Pret = 18; Cantitate = 3 }
)
$produse | Select-Object Produs, @{ Name = 'Total (lei)'; Expression = { $_.Pret * $_.Cantitate } }

Ieșire în terminal

Produs    Total (lei)
------    -----------
Cafea             100
Ceai              120
Prăjitură          54

Exemplul 3: -ExpandProperty: valori simple, nu obiecte

Obținem un tablou de șiruri, pe care îl putem uni direct cu -join.

$elevi = @(
    [pscustomobject]@{ Nume = 'Ana'; Nota = 9 }
    [pscustomobject]@{ Nume = 'Mihai'; Nota = 7 }
    [pscustomobject]@{ Nume = 'Ioana'; Nota = 10 }
)
$nume = $elevi | Select-Object -ExpandProperty Nume
$nume -join ', '

Ieșire în terminal

Ana, Mihai, Ioana

Greșeli frecvente

  • Select-Object Nume întoarce obiecte cu o proprietate Nume, nu șiruri: "Salut $x" afișează atunci @{Nume=Ana}. Pentru valori simple folosește -ExpandProperty Nume sau $elevi.Nume.
  • -Unique ține cont de majuscule: 'Iași', 'iași' rămân două valori. Adaugă -CaseInsensitive (7.4+) sau folosește Sort-Object -Unique, care nu ține cont de majuscule.
  • Select-Object -First 5 pus după Sort-Object e corect; pus înainte, alegi primele 5 obiecte nesortate și abia apoi le sortezi.

Comenzi înrudite

  • Where-Object: Filtrează obiectele din pipeline și le lasă să treacă doar pe cele care îndeplinesc o condiție.
  • Sort-Object: Sortează obiectele după una sau mai multe proprietăți, crescător sau descrescător, opțional doar primele N.
  • Format-Table: Afișează obiectele ca tabel, cu coloanele alese de tine, inclusiv coloane calculate.
  • Get-Member: Arată tipul obiectelor dintr-un pipeline și ce proprietăți și metode au, ca să știi ce poți selecta, filtra sau apela.
  • Pipeline (|): Operatorul | trimite obiectele unei comenzi, unul câte unul, comenzii următoare; $_ este obiectul curent, iar && și || înlănțuie comenzi.