ca multe alte limbi, PowerShell are declarații pentru executarea condiționată a codului în scripturile dvs. Una dintre aceste declarații este declarația if. Astăzi vom face o scufundare profundă într-una dintre cele mai fundamentale comenzi din PowerShell.,
- Index
- Condiționată de executie
- if
- operatori de Comparație
- -eq pentru egalitatea
- -ne nu este egal
- -gt -ge -lt-le pentru mai mult sau mai puțin decât
- -ca wildcard meciuri
- -meci expresie regulată
- -este de tip
- -eq pentru egalitatea
- Colectare operatorii
- -conține
- -in
- operatori Logici
- -nu.
- !,pressions
- Verificarea pentru $nul
- Variabilei
- Alternative cale de execuție
- mai mult
- Imbricate dacă
- elseif
- schimb
- Conducte
- Array inline
- Simplifica operațiunile complexe
- Linie continuare
- Pre-calcularea rezultatelor
- mai Multe dacă declarațiile
- Utilizarea funcțiilor
- Eroare de manipulare
- cuvinte Finale
Condiționată de executie
Scenariile vor de multe ori nevoie pentru a lua decizii și de a efectua diferite de logica pe baza acestor decizii., Asta vreau să spun prin execuție condiționată. Aveți o declarație sau o valoare de evaluat, apoi executați diferite secțiuni de cod pe baza evaluării respective. Aceasta este exact ceea ce face declarația
if
.if
Aici este un exemplu foarte de bază ale
if
declarație:$condition = $true if ( $condition ) { Write-Output "The condition was true" }
primul lucru Pe care
if
declarație nu este evaluează expresia din paranteze., Dacă evaluează la$true
, atunci va executascriptblock
în bretele. Dacă valoarea a fost$false
, atunci ar sări peste acel scriptblock.În exemplul anterior,
if
declarație a fost doar evaluarea$condition
variabilă. Acesta a fost$true
și-ar fi executatWrite-Output
comandă în interiorul scriptblock.În unele limbi, puteți plasa o singură linie de cod după declarația
if
și va fi executată., Nu este cazul în PowerShell. Trebuie să furnizați un completscriptblock
cu bretele pentru ca acesta să funcționeze corect.operatori de comparare
cel mai obișnuit lucru pe care îl veți folosi declarația
if
este compararea a două elemente între ele. Powershell are operatori speciali pentru diferite scenarii de comparație. Când utilizați un operator de comparație, valoarea din partea stângă este comparată cu valoarea din partea dreaptă.,-eq pentru egalitate
-eq
face o verificare a egalității între două valori pentru a vă asigura că acestea sunt egale între ele.$value = Get-MysteryValue if ( 5 -eq $value ) { # do something }
În acest exemplu, am lua o valoare cunoscută a
5
și comparând-o cu a mea$value
pentru a vedea dacă acestea se potrivesc.o posibilă utilizarecaz este de a verifica starea unei valori înainte de a lua o acțiune pe ea. Ai putea obține un serviciu și verificați dacă starea a fost difuzate înainte de a sunat
Restart-Service
pe ea.,Acesta este comun în alte limbi, cum ar fi C# pentru a folosi
==
pentru egalitate (ex:5 == $value
), dar care nu funcționează cu powershell. O altă greșeală obișnuită pe care oamenii o fac este să folosească semnul egal (ex:5 = $value
) care este rezervat pentru atribuirea valorilor variabilelor. Prin plasarea valorii tale cunoscute pe stânga, face ca această greșeală să fie mai ciudată.acest operator (și altele) au câteva variații.,-
-eq
caz insensibil egalitatea -
-ieq
caz insensibil egalitatea -
-ceq
sensibilă la egalitate
-ne nu este egal
Mulți operatori au legate de un operator care este de verificare pentru rezultatul opus.
-ne
va verifica valorile nu sunt egale între ele.if ( 5 -ne $value ) { # do something }
Folositi aceasta pentru a se asigura că acțiunea execută numai dacă valoarea nu este
5
., O bună utilizare-cazuri în care ar fi pentru a verifica dacă un serviciu a fost în stare de funcționare înainte de a încerca și porniți-l.Variante:
-
-ne
majuscule nu este egal -
-ine
majuscule nu este egal -
-cne
sensibilă nu este egal
Acestea sunt doar inverse variante de
-eq
. Voi grupa aceste tipuri împreună atunci când am lista variații pentru alți operatori.,– gt-ge-lt-le pentru mai mare sau mai mică decât
acești operatori sunt utilizați atunci când se verifică dacă o valoare este mai mare sau mai mică decât o altă valoare.
-gt -ge -lt -le
suport pentru mai mare, GreaterThanOrEqual, mai mică, și LessThanOrEqual.,eater decât sau egale, caz insensibil - !,pressions
-
-cge
mai mare sau egal, caz sensibil -
-lt
mai mult -
-ilt
mai puțin decât, caz insensibil -
-clt
mai puțin decât, case sensitive -
-le
mai mic sau egal cu -
-ile
egală cu sau mai mică, caz insensibil -
-cle
egală cu sau mai mică, case sensitive
nu știu de ce ți-ar folosi de caz sensibil și insensibil opțiuni pentru acești operatori.,PowerShell are propria sintaxă de potrivire a modelului bazat pe wildcard și îl puteți utiliza cu operatorul
-like
. Aceste modele wildcard sunt destul de bază.-
?
va potrivi cu orice caracter unic -
*
va potrivi cu orice număr de caractere
$value = 'S-ATX-SQL01' if ( $value -like 'S-*-SQL??') { # do something }
Este important să subliniem că modelul se potrivește întregul șir., Dacă trebuie să potriviți ceva în mijlocul șirului, va trebui să plasați
*
pe ambele capete ale șirului.,iv> - -nu.
Variante:
-
-like
caz insensibil wildcard -
-ilike
caz insensibil wildcard -
-clike
case sensitive wildcard -
-notlike
caz insensibil wildcard nu se potrivesc -
-inotlike
caz insensibil wildcard nu se potrivesc -
-cnotlike
case sensitive wildcard nu se potrivesc
-meci expresie regulată
-match
operator vă permite să verificați un șir pentru o expresie regulată pe baza de meci., Utilizați acest lucru atunci când modelele wildcard nu sunt suficient de flexibile pentru tine.
$value = 'S-ATX-SQL01' if ( $value -match 'S-\w\w\w-SQL\d\d') { # do something }
un model regex se va potrivi oriunde în șir în mod implicit. Deci, puteți specifica o substring pe care doriți potrivire ca aceasta:
$value = 'S-ATX-SQL01' if ( $value -match 'SQL') { # do something }
Regex este un limbaj complex propriu și merită privit. Vorbesc mai multe despre -match
și despre numeroasele modalități de utilizare a regex într-un alt articol.,
Variations:
-
-match
case insensitive regex -
-imatch
case insensitive regex -
-cmatch
case sensitive regex -
-notmatch
case insensitive regex not matched -
-inotmatch
case insensitive regex not matched -
-cnotmatch
case sensitive regex not matched
-is of type
You are able to check a value’s type with the -is
operator.,
if ( $value -is ) { # do something }
puteți utiliza acest lucru dacă lucrați cu clase sau acceptați diverse obiecte peste conductă. Ai putea avea fie un serviciu sau un nume de serviciu ca intrare. Apoi verificați dacă aveți un serviciu și preluați serviciul dacă aveți doar numele.,
if ( $Service -isnot ) { $Service = Get-Service -Name $Service }
Variante:
-
-is
de tip -
-isnot
nu de tip
de Colectare operatorii
atunci Când utilizați operatori cu o singură valoare, rezultatul este $true
sau $false
. Acest lucru este tratat ușor diferit atunci când lucrați cu o colecție. Fiecare element din colecție este evaluat și operatorul va returna în schimb fiecare valoare care se evaluează la $true
.,
PS> 1,2,3,4 -eq 3 3
Acesta încă mai funcționează corect într-un if
declarație. Deci, o valoare este returnată de operatorul dvs., atunci întreaga declarație este $true
.
$array = 1..6 if ( $array -gt 3 ) { # do something }
există o mică capcană care se ascunde în detaliile de aici pe care trebuie să le subliniez. Când utilizați operatorul -ne
în acest fel, este ușor să priviți greșit logica înapoi., Folosind -ne
cu o colecție va reveni $true
dacă orice element din colecție nu se potrivește cu valoarea ta.
PS> 1,2,3 -ne 4 1 2 3
Acest lucru poate arata ca un truc inteligent, dar trebuie operatorii -contains
și -in
care se ocupa de acest lucru mai eficient și -notcontains
va face în mod corect ceea ce vă așteptați.
-conține
operatorul -contains
va verifica colecția pentru valoarea dvs., De îndată ce găsește o potrivire, va reveni $true
.
$array = 1..6 if ( $array -contains 3 ) { # do something }
acesta este modul preferat de a vedea dacă o colecție conține valoarea dvs. Folosind Where-Object
( sau -eq
) va mers pe jos întreaga listă de fiecare dată și să fie în mod semnificativ mai lent.,
Variante:
-
-contains
caz insensibil meci -
-icontains
caz insensibil meci -
-ccontains
sensibilă la meci -
-notcontains
caz insensibil nu se potrivesc -
-inotcontains
caz insensibil nu se potrivesc -
-cnotcontains
case sensitive nu se potrivesc
în
-in
operator este la fel ca -contains
operator, cu excepția colecției este pe partea dreaptă.,
$array = 1..6 if ( 3 -in $array ) { # do something }
Variations:
-
-in
case insensitive match -
-iin
case insensitive match -
-cin
case sensitive match -
-notin
case insensitive not matched -
-inotin
case insensitive not matched -
-cnotin
case sensitive not matched
Logical operators
Logical operators are used to invert or combine other expressions.,
-nu.
-not
operator răstoarnă o expresie de $false
și $true
sau $true
și $false
. Iată un exemplu în care dorim să efectuăm o acțiune când Test-Path
este $false
.
if ( -not ( Test-Path -Path $path ) )
cele Mai multe dintre operatorii despre care am vorbit nu au o variație în cazul în care tu nu ar trebui să folosească -not
operator, dar încă mai există ori ai folosi-o.
!,
puteți utiliza !
ca alias pentru -not
.
if ( -not $value ){} if ( !$value ){}
Veți vedea !
folosit de mai multe persoane care provin din alte limbi, cum ar fi C#. Prefer să-l tastați pentru că mi se pare greu pentru a vedea atunci când se uită rapid la script-urile mele.
– și
puteți combina expresii cu operatorul -and
. Când faci asta, ambele părți trebuie să fie $true
pentru întreaga expresie să fie $true
.,
if ( ($age -gt 13) -and ($age -lt 55) )
În acest exemplu, $age
trebuie să fie 13 ani sau mai în vârstă pentru partea stângă și mai puțin de 55 de ani pentru partea dreapta. Am adăugat paranteze suplimentare pentru a face mai clar în acest exemplu, dar ele sunt opționale, atâta timp cât expresia este simplu. Iată același exemplu fără ele.
if ( $age -gt 13 -and $age -lt 55 )
evaluarea se întâmplă de la stânga la dreapta. Dacă primul element evaluează la $false
atunci va ieși devreme și nu va efectua comparația corectă., Acest lucru este util atunci când trebuie să vă asigurați că există o valoare înainte de ao utiliza. Test-Path
de exemplu, va arunca o eroare dacă îi dați o cale $null
.
if ( $null -ne $path -and (Test-Path -Path $path) )
sau
-or
vă permite să specificați două expresii și returnează $true
dacă unul dintre ele este $true
.
if ( $age -le 13 -or $age -ge 55 )
la fel ca și cu -and
operator, evaluarea se întâmplă de la stânga la dreapta., Cu excepția faptului că, dacă prima parte este $true
, atunci întreaga declarație este $true
și acesta nu va procesului restul de exprimare.de asemenea, notați cum funcționează sintaxa pentru acești operatori. Aveți nevoie de două expresii separate. Am văzut că utilizatorii încearcă să facă ceva de genul $value -eq 5 -or 6
fără să-și dea seama de greșeala lor.
– xsau exclusiv sau
acesta este puțin neobișnuit. -xor
permite o singură expresie pentru a evalua la$true
., Deci, dacă ambele elemente sunt $false
sau ambele elemente sunt $true
, atunci intreaga expresie este $false
. Un alt mod de a privi acest lucru este expresia este doar $true
atunci când rezultatele expresiei sunt diferite.
este rar ca cineva să folosească vreodată acest operator logic și nu mă pot gândi la un exemplu bun de ce l-aș folosi vreodată.
operatorii Bitwise
operatorii Bitwise efectuează calcule pe biții din cadrul valorilor și produc o nouă valoare ca rezultat., Predarea operatorilor bitwise este dincolo de domeniul de aplicare al acestui articol, dar aici este lista ei.
-
-band
binar ȘI -
-bor
binar SAU -
-bxor
binar SAU exclusiv -
-bnot
binar NU -
-shl
schimb -
-shr
shift dreapta
PowerShell expresii
putem folosi normal PowerShell în stare de declarație.,
if ( Test-Path -Path $Path )
Test-Path
livrare $true
sau $false
când se execută. Acest lucru se aplică și comenzilor care returnează alte valori.
if ( Get-Process Notepad* )
Se va evalua la $true
dacă există o revenit proces și $false
dacă nu este nimic., Este perfect valabil pentru a utiliza conducte expresii sau alte PowerShell afirmații de genul asta:
if ( Get-Process | Where Name -eq Notepad )
Aceste expresii pot fi combinate cu fiecare alte cu -and
și -or
operatori, dar trebuie să utilizați paranteze pentru a le sparge în sub-expresii.
if ( (Get-Process) -and (Get-Service) )
Verificare pentru $nul
Având o nici un rezultat sau un $null
valoare se evaluează la $false
în if
declarație., Când verificați în mod specific $null
, este o bună practică să plasați $null
pe partea stângă.
if ( $null -eq $value )
Există destul de câteva nuanțe atunci când se ocupă cu $null
valori în PowerShell. Dacă sunteți interesat de scufundări mai adânc, am un articol despre tot ce ai vrut să știi despre $null.
Variabilei
aproape că am uitat să adăugați asta până Prasoon Karunan V mi-a amintit de ea.,
în mod normal, atunci când atribuiți o valoare unei variabile, valoarea nu este trecută pe conductă sau consolă. Când faci o alocare variabilă într-o expresie sub, aceasta se trece pe la conducta.
PS> $first = 1 PS> ($second = 2) 2
Vezi cum $first
misiune nu are nici o ieșire și $second
misiune nu? Când o sarcină se face într-un if
declarație, se va executa la fel ca $second
atribuirea de mai sus., Aici este un curat exemplu despre cum ai putea folosi:
if ( $process = Get-Process Notepad* ) { $process | Stop-Process }
Dacă $process
se atribuie o valoare, atunci situația va fi $true
și $process
va fi oprit.
asigurați-vă că nu confundați acest lucru cu -eq
deoarece aceasta nu este o verificare a egalității. Aceasta este o caracteristică mai obscură pe care majoritatea oamenilor nu-și dau seama că funcționează în acest fel.,
Supleant cale de execuție
if
declarație vă permite să specificați o acțiune pentru care nu numai atunci când declarația este $true
, dar, de asemenea, pentru atunci când este $false
. Aici intră în joc declarația else
.
mai mult
else
declarație este întotdeauna ultima parte a if
declarație atunci când este utilizat.
în acest exemplu, verificăm $path
pentru a ne asigura că este un fișier. Dacă găsim fișierul, îl mutăm. Dacă nu, scriem un avertisment., Acest tip de logică de ramificare este foarte frecventă.
Imbricate dacă
if
și else
declarații ia un bloc de script-ul, astfel încât să putem plasa orice comanda PowerShell în interiorul lor, inclusiv un alt if
declarație. Acest lucru vă permite să utilizați o logică mult mai complicată.
în acest exemplu, testăm mai întâi calea fericită și apoi luăm măsuri în acest sens. În cazul în care nu reușește, vom face o altă verificare și pentru a oferi informații mai detaliate pentru utilizator.
elseif
Nu ne limităm la o singură verificare condiționată., Putem lanț if
și else
declarații împreună în loc de cuibărit-le cu ajutorul elseif
declarație.
execuția se întâmplă de sus în jos. Declarația de sus if
este evaluată mai întâi. Dacă este $false
, apoi se mută în jos la următoarea elseif
sau else
în listă. Ultima else
este acțiunea implicită pentru a lua, dacă nici unul dintre ceilalți reveni $true
.,
comutator
la punctul tis, trebuie să menționez instrucțiunea switch
. Acesta oferă o sintaxă alternativă pentru a face comparații multiple cu o valoare. Cu switch
, specificați o expresie și acest rezultat este comparat cu mai multe valori diferite. Dacă una dintre aceste valori mach, atunci blocul de cod de potrivire este executat. Uită-te la acest exemplu:
$itemType = 'Role' switch ( $itemType ) { 'Component' { 'is a component' } 'Role' { 'is a role' } 'Location' { 'is a location' } }
Există trei valori posibile care se potrivesc $itemType
., În acest caz, se va potrivi cu Role
și is a role
va fi executat. Am folosit un exemplu foarte simplu doar pentru a vă oferi o anumită expunere la operatorul switch
. Vorbesc mai mult despre tot ce ai vrut vreodată să știi despre declarația switch într-un alt articol.conducta este o caracteristică foarte unică și importantă a PowerShell. Orice valoare care nu este suprimată sau atribuită unei variabile este plasată în conductă., if
ne oferă o modalitate de a profita de conductă într-un mod care nu este întotdeauna evident.
$discount = if ( $age -ge 55 ) { Get-SeniorDiscount } elseif ( $age -le 13 ) { Get-ChildDiscount } else { 0.00 }
fiecare bloc de script este plasarea rezultatelor comenzile sau valoarea în conductă. Apoi atribuim rezultatul declarației if variabilei $discount
. Acest exemplu ar fi putut la fel de ușor să atribuie aceste valori variabilei $discount
direct în fiecare scriptblock., Nu pot spune că folosesc acest lucru cu declarația if
foarte des, dar am un exemplu în care am folosit acest lucru recent.
Array inline
am o funcție numită Invoke-SnowSql care lansează un executabil cu mai multe argumente de linie de comandă. Aici este un clip de la acea funcție în cazul în care am construi matrice de argumente.
variabilele$Debug
și$Path
sunt parametri ai funcției care sunt furnizați de utilizatorul final. Le evaluez în linie în interiorul inițializării matricei mele., Dacă $Debug
este adevărat, atunci aceste valori se încadrează în $snowSqlParam
în locul corect. Același lucru este valabil și pentru variabila $Path
.
Simplificați operațiile complexe
este inevitabil să vă confruntați cu o situație care are prea multe comparații pentru a verifica și dacă declarația dvs. se derulează în partea dreaptă a ecranului.ele pot fi greu de citit și care te fac mai predispus la greșeli. Sunt câteva lucruri pe care le putem face în legătură cu asta.,
continuarea liniei
există unii operatori din PowerShell care vă permit să vă înfășurați comanda la linia următoare. Operatorii logici -and
și -or
sunt operatori buni de utilizat dacă doriți să vă rupeți expresia în mai multe linii.există încă multe lucruri care se întâmplă acolo, dar plasarea fiecărei piese pe propria linie face o mare diferență. În general, fac acest lucru doar atunci când primesc mai mult de două comparații sau dacă trebuie să derulez spre dreapta pentru a citi oricare dintre ligic.,
Pre-calcularea rezultatelor
putem lua această declarație din declarația if și verifica doar rezultatul.acest lucru se simte mult mai curat decât exemplul anterior. De asemenea, vi se oferă posibilitatea de a utiliza un nume de variabilă care explică ceea ce este că sunteți într-adevăr de verificare. Acest lucru este, de asemenea, și exemplu de cod de auto-documentare care salvează comentarii inutile.
multiple if declarații
putem rupe acest lucru în mai multe declarații și să le verifice la un moment dat. În acest caz, vom folosi un steag sau o variabilă de urmărire pentru a combina rezultatele.,
a trebuit să inversez logica pentru ca logica steagului să funcționeze corect. Fiecare evaluare este o declarație individuală if
. Avantajul acestui lucru este că atunci când depanați, puteți spune exact ce face logica. Am reușit să adaug o verbozitate mult mai bună în același timp.dezavantajul evident este că este mult mai mult cod pentru a scrie. Codul este mai complex să se uite la ca este nevoie de o singură linie de logică și explodează – l în 25 sau mai multe linii.
folosind funcții
putem muta, de asemenea, toată logica de validare într-o funcție., Uită-te la cât de curat arată dintr-o privire.
if ( Test-SecureDriveConfiguration -ADUser $user ) { # do something }
încă mai trebuie să creați funcția pentru a face validarea, dar face acest cod mult mai ușor de a lucra cu. Face acest cod mai ușor de testat. În testele dvs., puteți batjocori apelul la Test-ADDriveConfiguration
și aveți nevoie doar de două teste pentru această funcție. Unul în care returnează $true
și unul în care returnează $false
. Testarea celeilalte funcții va fi mai simplă, deoarece este atât de mică.,
corpul acelei funcții ar putea fi încă acea linie cu care am început sau logica explodată pe care am folosit-o în ultima secțiune. Acest lucru funcționează bine pentru ambele scenarii și vă permite să modificați cu ușurință această implementare mai târziu.o utilizare foarte importantă a instrucțiunii if
este să verificați condițiile de eroare înainte de a vă confrunta cu erori. Un bun exemplu este să verificați dacă există deja un folder înainte de a încerca să îl creați.,
if ( -not (Test-Path -Path $folder) ) { New-Item -Type Directory -Path $folder }
îmi place să spun că, dacă vă așteptați o excepție să se întâmple, atunci ei nu într-adevăr o excepție. Așadar, verificați-vă valorile și validați-vă Condițiile unde puteți.
dacă doriți să se scufunde un pic mai mult în manipularea reală excepție, am un articol pe tot ceea ce ai vrut vreodată să știi despre excepții.
cuvinte finale
declarațiaif
este o declarație atât de simplă, dar este o piesă foarte fundamentală a PowerShell. Vă veți găsi folosind acest lucru de mai multe ori în aproape fiecare script pe care îl scrieți., Sper că ai o înțelegere mai bună decât ai avut înainte.