Powershell: tot ce ați vrut să știți despre declarația IF

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
  • 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 executa scriptblock î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 executat Write-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 complet scriptblock 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

    • -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>

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-Pathde 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. -xorpermite 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.

Share

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *