Tablouri (@()) în PowerShell

Variabile și tipuri Windows PowerShell 1.0

Un tablou ține mai multe valori; îl creezi cu virgule sau @(), îl citești cu [index], iar += creează de fiecare dată un tablou nou.

Sintaxă
$t = 'a', 'b', 'c'
$t = @(comandă)
$t[0]; $t[-1]; $t.Count

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ște List[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 .Count sau 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 tip System.Collections.ArrayList fă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.