switch în PowerShell

Control și funcții Windows PowerShell 1.0

switch compară o valoare (sau fiecare element al unei colecții) cu mai multe modele și rulează blocul celor potrivite; are -Wildcard și -Regex.

Sintaxă
switch [-Wildcard | -Regex | -Exact] [-CaseSensitive] (<valoare>) {
    <model> { <acțiune> }
    default { <acțiune> }
}

Ce face switch

switch înlocuiește un șir lung de if/elseif care compară aceeași valoare. Fiecare rând are un model și un bloc; default rulează când niciun model nu s-a potrivit. Spre deosebire de alte limbaje, PowerShell verifică toate modelele, deci dacă se potrivesc două, rulează ambele blocuri. Ca să te oprești la prima potrivire, pune break în bloc. Implicit comparația nu ține cont de majuscule; -CaseSensitive o face strictă.

Fără parametri, potrivirea este exactă. -Wildcard permite modele ca '*.pdf', iar -Regex expresii regulate, cu grupurile disponibile în $Matches în blocul respectiv. Valoarea curentă e în $_. Un model poate fi și un bloc de script care întoarce adevărat sau fals: { $_ -gt 100 }. switch convertește valorile la text înainte de comparație, așa că pentru numere sau tipuri e mai sigur să folosești un bloc de script.

Dacă dai o colecție, switch o parcurge element cu element; în acest caz break oprește tot switch-ul, iar continue trece la elementul următor. Cu -File cale, citește un fișier rând cu rând, util pentru loguri mari.

Parametri

Parametru Descriere
-Exact Potrivire exactă (comportamentul implicit).
-Wildcard Modelele sunt wildcard: *, ?, [ ].
-Regex Modelele sunt expresii regulate; grupurile apar în $Matches.
-CaseSensitive Ține cont de majuscule.
-File Citește valorile din fișier, câte un rând.
default Blocul pentru cazul în care niciun model nu se potrivește.
break / continue break iese din switch; continue trece la următorul element al colecției.

Exemple

Exemplul 1: Zi lucrătoare sau weekend

switch primește un tablou și tratează fiecare zi; default prinde restul.

switch ('luni', 'sâmbătă', 'duminică') {
    'sâmbătă'  { "$_ -> weekend" }
    'duminică' { "$_ -> weekend" }
    default    { "$_ -> zi lucrătoare" }
}

Ieșire în terminal

luni -> zi lucrătoare
sâmbătă -> weekend
duminică -> weekend

Exemplul 2: Tipul fișierului după extensie (-Wildcard)

Modelele cu * funcționează doar cu -Wildcard; fără el, '*.pdf' ar fi căutat ca text exact.

$fisiere = 'raport.pdf', 'poza-iasi.jpg', 'buget.xlsx'
switch -Wildcard ($fisiere) {
    '*.pdf' { "$_ : document PDF" }
    '*.jpg' { "$_ : imagine" }
    default { "$_ : alt tip" }
}

Ieșire în terminal

raport.pdf : document PDF
poza-iasi.jpg : imagine
buget.xlsx : alt tip

Exemplul 3: Extragi numere din text (-Regex)

Grupul din paranteze ajunge în $Matches[1]. $(...) e nevoie pentru index în interiorul ghilimelelor.

switch -Regex ('Comanda 1245 - Iași', 'Retur 88 - Cluj') {
    '^Comanda (\d+)' { "Comandă nouă: $($Matches[1])" }
    '^Retur (\d+)'   { "Retur: $($Matches[1])" }
}

Ieșire în terminal

Comandă nouă: 1245
Retur: 88

Greșeli frecvente

  • Să te aștepți ca switch să se oprească la primul model potrivit: le verifică pe toate. Adaugă break dacă vrei o singură ramură (și ține minte că la colecții break oprește tot).
  • Să scrii modele cu * fără -Wildcard: sunt comparate ca text exact și nu se potrivesc.
  • Să compari numere cu modele de tip text când valoarea e un enum sau o dată: switch le transformă în text. Folosește modele bloc de script, de exemplu { $_ -eq 4 }.

Comenzi înrudite

  • if / elseif / else: if rulează un bloc de cod doar când condiția e adevărată; elseif și else tratează celelalte cazuri, iar ?: (din PowerShell 7.0) e forma scurtă.
  • Operatori de comparație: PowerShell compară cu -eq, -ne, -gt, -lt, -like, -match, -contains, -in, nu cu = sau >; implicit nu ține cont de majuscule.
  • 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.
  • Get-Content: Citește conținutul unui fișier ca listă de linii (sau ca un singur șir cu -Raw); poate afișa primele sau ultimele linii și urmări un log.