Hashtable (@{}) în PowerShell

Variabile și tipuri Windows PowerShell 1.0

Un hashtable ține perechi cheie-valoare; [ordered] păstrează ordinea cheilor, iar [pscustomobject] transformă perechile într-un obiect.

Sintaxă
$h = @{ Cheie = valoare; Alta = valoare }
$h = [ordered]@{ ... }
[pscustomobject]@{ Proprietate = valoare }

Ce face Hashtable (@{})

Un hashtable (dicționar) se scrie cu @{ } și perechi Cheie = valoare, separate prin ; sau pe rânduri diferite. Citești o valoare cu $h.Cheie sau $h['Cheie'], adaugi sau modifici cu $h['Cheie'] = valoare sau $h.Add('Cheie', valoare), ștergi cu $h.Remove('Cheie') și verifici cu $h.ContainsKey('Cheie'). Cheile nu țin cont de majuscule. .Keys, .Values și .Count dau cheile, valorile și numărul de perechi.

Ordinea cheilor într-un hashtable obișnuit nu este garantată. Când contează (afișare, export), folosește [ordered]@{ ... }, disponibil din Windows PowerShell 3.0, care creează un OrderedDictionary. [ordered] se pune imediat înaintea lui @, nu înaintea numelui variabilei. Pentru a parcurge perechile prin pipeline, folosește $h.GetEnumerator(), care trimite obiecte cu .Key și .Value.

Tot din 3.0, [pscustomobject]@{ ... } transformă perechile într-un obiect cu proprietăți, în ordinea scrisă. Este felul uzual de a-ți construi propriile rânduri de date: le poți sorta, filtra, afișa în tabel sau exporta cu Export-Csv și ConvertTo-Json, exact ca ieșirea unui cmdlet.

Parametri

Parametru Descriere
@{ K = v } Creează un hashtable.
[ordered]@{ K = v } Dicționar care păstrează ordinea cheilor (Windows PowerShell 3.0+).
$h.K / $h['K'] Citește valoarea cheii K.
$h['K'] = v Adaugă cheia sau îi schimbă valoarea.
.Add(K, v) Adaugă o cheie; dă eroare dacă cheia există deja.
.Remove(K) Șterge cheia.
.ContainsKey(K) True dacă cheia există.
.GetEnumerator() Trimite perechile prin pipeline, ca obiecte cu Key și Value.
[pscustomobject]@{...} Creează un obiect cu proprietățile date, în ordinea scrisă (Windows PowerShell 3.0+).

Exemple

Exemplul 1: Citești valori după cheie

Notația cu punct și cea cu paranteze drepte sunt echivalente.

$elev = @{ Nume = 'Ana'; Oras = 'Iași'; Nota = 10 }
$elev.Nume
$elev['Oras']
$elev.Count
$elev.ContainsKey('Varsta')

Ieșire în terminal

Ana
Iași
3
False

Exemplul 2: Lista de prețuri, în ordinea în care ai scris-o

Cu [ordered], cheia adăugată ulterior apare la final, iar afișarea are coloanele Name și Value.

$preturi = [ordered]@{ Cafea = 12; Ceai = 9 }
$preturi['Croissant'] = 8
$preturi

Ieșire în terminal

Name                           Value
----                           -----
Cafea                          12
Ceai                           9
Croissant                      8

Exemplul 3: Rânduri de date cu [pscustomobject]

Obiectele se sortează după proprietatea Nota ca orice ieșire de cmdlet. Coloana numerică e aliniată la dreapta.

$elevi = @(
    [pscustomobject]@{ Nume = 'Ana'; Oras = 'Iași'; Nota = 10 }
    [pscustomobject]@{ Nume = 'Mihai'; Oras = 'Cluj'; Nota = 9 }
)
$elevi | Sort-Object Nota

Ieșire în terminal

Nume  Oras Nota
----  ---- ----
Mihai Cluj    9
Ana   Iași   10

Greșeli frecvente

  • Să te bazezi pe ordinea cheilor dintr-un @{ } obișnuit: poate diferi de cea scrisă. Folosește [ordered].
  • Să scrii [ordered]$h = @{ }: dă eroare de parsare. Corect: $h = [ordered]@{ }.
  • Să trimiți un hashtable direct în Export-Csv sau Sort-Object și să aștepți câte un rând pe cheie: hashtable-ul e un singur obiect. Folosește .GetEnumerator() sau transformă-l în [pscustomobject].
  • Să folosești .Add() pentru o cheie care există deja: dă eroare. Pentru „adaugă sau înlocuiește” folosește $h['Cheie'] = valoare.

Comenzi înrudite

  • Variabile și tipuri: Variabilele încep cu $, primesc orice obiect .NET și pot fi legate de un tip ([int], [string], [datetime]); .GetType() arată tipul.
  • Tablouri (@()): Un tablou ține mai multe valori; îl creezi cu virgule sau @(), îl citești cu [index], iar += creează de fiecare dată un tablou nou.
  • Select-Object: Alege doar anumite proprietăți ale obiectelor, adaugă proprietăți calculate sau păstrează primele, ultimele ori unicele elemente.
  • Export-Csv: Salvează obiectele într-un fișier CSV: un rând de antet cu numele proprietăților și câte un rând pentru fiecare obiect.
  • ConvertTo-Json: Transformă obiecte PowerShell într-un șir JSON, de exemplu pentru un fișier de configurare sau corpul unei cereri către un API.