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
switchsă se oprească la primul model potrivit: le verifică pe toate. Adaugăbreakdacă vrei o singură ramură (și ține minte că la colecțiibreakopreș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ă:
switchle 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.