Ce face Tablouri (@())
Un tablou (array) se creează cu valori separate prin virgulă: $orase = 'Iași', 'Cluj', 'Brașov'. Operatorul @( ... ) pune rezultatul unei comenzi într-un tablou chiar dacă are zero sau un singur element, ceea ce te ferește de surprize când o comandă găsește un singur fișier: @(Get-ChildItem *.pdf).Count. Tabloul gol este @(), iar 1..5 dă numerele de la 1 la 5.
Elementele se citesc cu indexul, de la 0: $orase[0] este primul, $orase[-1] ultimul, $orase[0..1] primele două. .Count dă numărul de elemente. Un tablou obișnuit are dimensiune fixă: += nu adaugă în el, ci creează un tablou nou cu toate valorile vechi plus cea nouă. Pentru câteva elemente nu contează, dar într-o buclă cu mii de pași devine lent, iar metoda .Add() a tabloului dă eroare.
Când adaugi des elemente, folosește o listă generică: [System.Collections.Generic.List[int]]::new() (sau List[string], List[object]) are .Add(), .Remove() și .Count și crește fără copieri. O altă variantă des folosită este să atribui direct rezultatul unei bucle: $patrate = foreach ($n in 1..5) { $n * $n }. Poți forța și un tablou cu tip: [int[]]$note = 9, 10, 7.
Parametri
| Parametru | Descriere |
|---|---|
$t = a, b, c |
Creează un tablou din valori separate prin virgulă. |
@(...) |
Pune rezultatul într-un tablou, chiar dacă are 0 sau 1 element. |
$t[i] |
Elementul de la indexul i (de la 0); $t[-1] este ultimul. |
$t.Count |
Numărul de elemente. |
$t += x |
Creează un tablou nou cu elementul x adăugat la final. |
[int[]]$t |
Tablou care acceptă doar valori de tipul dat. |
List[T] |
[System.Collections.Generic.List[T]]::new(): listă care crește, cu .Add() și .Remove(). |
.Where({...}) / .ForEach({...}) |
Filtrează sau transformă elementele fără pipeline (din PowerShell 4.0). |
Exemple
Exemplul 1: Creezi și citești un tablou
Indexul negativ numără de la sfârșit.
$orase = 'Iași', 'Cluj', 'Brașov'
$orase[0]
$orase[-1]
$orase.Count
Ieșire în terminal
Iași
Brașov
3
Exemplul 2: += merge, .Add() nu
+= creează un tablou nou cu patru elemente. Metoda .Add() eșuează pentru că tabloul are dimensiune fixă.
$orase = 'Iași', 'Cluj', 'Brașov'
$orase += 'Timișoara'
$orase.Count
$orase.Add('Sibiu')
Ieșire în terminal
4
MethodInvocationException: Exception calling "Add" with "1" argument(s): "Collection was of a fixed size."
Exemplul 3: O listă care crește: List[int]
Pentru notele adunate într-o buclă, lista generică e potrivită. Measure-Object calculează media.
$note = [System.Collections.Generic.List[int]]::new()
$note.Add(9)
$note.Add(10)
$note.Add(7)
$note.Count
($note | Measure-Object -Average).Average
Ieșire în terminal
3
8.66666666666667
Greșeli frecvente
- Să folosești
+=într-o buclă mare: fiecare pas copiază tot tabloul. FoloseșteList[T]sau atribuie direct rezultatul buclei. - Să presupui că o comandă întoarce mereu un tablou: dacă găsește un singur element, primești chiar elementul. Înfășoară comanda în
@(...)când te bazezi pe.Countsau pe index. - Să crezi că
$t[0..-2]înseamnă „toate, mai puțin ultimul”: intervalul 0, -1, -2 dă primul, ultimul și penultimul element. - Să scrii
$note.Add(9)pe o listă de tipSystem.Collections.ArrayListfără[void]: metoda ei întoarce indexul, care apare în ieșire.List[T].Add()nu întoarce nimic.
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.Hashtable (@{}): Un hashtable ține perechi cheie-valoare; [ordered] păstrează ordinea cheilor, iar [pscustomobject] transformă perechile într-un obiect.foreach: Buclele foreach, for, while și do-while repetă un bloc de cod; foreach parcurge o colecție din memorie, ForEach-Object lucrează în pipeline.Operatori de comparație: PowerShell compară cu -eq, -ne, -gt, -lt, -like, -match, -contains, -in, nu cu = sau >; implicit nu ține cont de majuscule.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.