Powershell: Minden, amit tudni akartál az if utasítás

Mint sok más nyelven, PowerShell van kimutatások feltételesen végrehajtó kódot a forgatókönyvet. Az egyik ilyen kijelentés az if nyilatkozat. Ma mélyen belemerülünk a PowerShell egyik legalapvetőbb parancsába.,

  • Index
  • a Feltételes végrehajtás
  • Az if utasítás
  • Összehasonlító operátorok
    • -eq az egyenlőség
      • -ék nem egyenlő
    • -gt -ge -lt -le a nagyobb vagy kisebb, mint a
    • -mint helyettesítő mérkőzések
    • -mérkőzés reguláris kifejezés
    • -típusú
  • Gyűjtemény szereplők
    • -tartalmaz
    • -a
  • Logikai operátorok
    • -nem
      • !,pressions
        • Ellenőrzése $null
        • a Változó feladatot
      • Alternatív végrehajtási út
        • más
        • Beágyazott, ha
        • elseif
        • kapcsolóval,
      • Csővezeték
        • Array inline
      • Egyszerűsítése, komplex műveletek
        • a Vonal folytatása
        • Pre-számítási eredmények
        • ha Több kimutatások
        • A funkciók
      • Hiba-kezelés
      • Utolsó szavai

      a Feltételes végrehajtás

      A scriptek gyakran kell döntéseket hozni, majd hajtsa végre a különböző logika alapján ezeket a döntéseket., Ezt értem a feltételes kivégzés alatt. Van egy nyilatkozat vagy érték, hogy értékelje, majd hajtsa végre a különböző szakaszok kód alapján, hogy az értékelés. Pontosan ezt teszi a if utasítás.

      az if állítás

      itt van egy nagyon alapvető példa a if nyilatkozat:

       $condition = $true if ( $condition ) { Write-Output "The condition was true" }

      Az első dolog a if a nyilatkozat zárójelben értékeli a kifejezést., Ha $true értékel, akkor végrehajtja a scriptblock A zárójelben. Ha az érték $false volt, akkor átugorja a scriptblock-ot.

      az előző példában aif utasítás csak a$condition változót értékelte. $trueés a Write-Output parancsot hajtotta volna végre a scriptblockon belül.

      egyes nyelveken a if utasítás után egyetlen kódsort helyezhet el, majd végrehajtásra kerül., A PowerShellben nem ez a helyzet. Be kell, hogy egy teljesscriptblock fogszabályozó, hogy megfelelően működjön.

      összehasonlító operátorok

      a leggyakoribb dolog, amit használni fog a if utasítás összehasonlítja a két elem egymással. A Powershell speciális operátorokkal rendelkezik a különböző összehasonlító forgatókönyvekhez. Összehasonlító operátor használatakor a bal oldali értéket összehasonlítjuk a jobb oldali értékkel.,

      – EQ az egyenlőségért

      a -eq két érték közötti egyenlőségellenőrzést végez annak biztosítása érdekében, hogy azok egyenlőek legyenek egymással.

       $value = Get-MysteryValue if ( 5 -eq $value ) { # do something }

      ebben a példában a5 ismert értékét veszem figyelembe, és összehasonlítom a$value azonosítóval.

      az egyik lehetséges használataz érték állapotának ellenőrzése, mielőtt végrehajtaná a műveletet. Lehet kapni egy szolgáltatást, és ellenőrizze, hogy az állapot fut, mielőtt az úgynevezett Restart-Service rajta.,

      más nyelveken, például a C# – ban gyakori a == használata az egyenlőséghez (ex: 5 == $value), de ez nem működik a powershell-rel. Egy másik gyakori hiba, amelyet az emberek elkövetnek, az egyenlő jel (ex: 5 = $value) használata, amely az értékek változókhoz való hozzárendelésére van fenntartva. Azáltal, hogy az ismert érték a bal oldalon, ez teszi, hogy téved több kínos, hogy.

      ennek az operátornak (és másoknak) van néhány variációja.,

      • -eq
      • -ieq
      • -ceq case sensitive equality

    -ne not equal

    sok üzemeltetőnek van egy kapcsolódó üzemeltetője, amely ellenőrzi az ellenkező eredményt. -ne ellenőrzi, hogy az értékek nem egyenlőek-e egymással.

     if ( 5 -ne $value ) { # do something }

    használja ezt annak biztosítására, hogy a művelet csak akkor hajtson végre, ha az érték nem5., Jó használat-olyan esetek, amikor ellenőrizni kell, hogy egy szolgáltatás futó állapotban van-e, mielőtt megpróbálná elindítani.

    variációk:

    • -ne case érzéketlen nem egyenlő
    • -ine case érzéketlen nem egyenlő
    • -cne case sensitive not equal

    -eqinverz variációi. Ezeket a típusokat csoportosítom, amikor felsorolom a variációkat más operátorok számára.,

    – gt-Ge-lt-le a

    – nél nagyobb vagy kisebb érték esetén ezeket az operátorokat használják annak ellenőrzésekor, hogy egy érték nagyobb vagy kisebb-e, mint egy másik érték. A nagyobb, nagyobb, kisebb és kisebb.,evő, mint vagy egyenlő, az esetben érzéketlen

  • -cge nagyobb vagy egyenlő, az esetben érzékeny
  • -lt kevesebb, mint
  • -ilt kevesebb, mint esetben érzéketlen
  • -clt kevesebb, mint case sensitive
  • -le kisebb vagy egyenlő
  • -ile kisebb vagy egyenlő, az esetben érzéketlen
  • -cle kisebb vagy egyenlő, case sensitive

nem tudom, hogy miért használja az esetben érzékeny, érzéketlen lehetőségek ezek a szereplők.,

– like wildcard matches

PowerShell saját helyettesítő alapú minta megfelelő szintaxis, és akkor használja a -like operátor. Ezek helyettesítő minták meglehetősen alapvető.

  • ? minden egyes karakternek megfelel
  • *
 $value = 'S-ATX-SQL01' if ( $value -like 'S-*-SQL??') { # do something }

fontos rámutatni, hogy a minta megfelel az egész karakterláncnak., Ha valamit meg kell egyeznie a karakterlánc közepén, akkor a * – ot kell elhelyeznie a karakterlánc mindkét végén.,iv>

Variációk:

  • -like esetben érzéketlen helyettesítő
  • -ilike esetben érzéketlen helyettesítő
  • -clike esetben érzékeny helyettesítő
  • -notlike esetben érzéketlen helyettesítő nem egyezik
  • -inotlike esetben érzéketlen helyettesítő nem egyezik
  • -cnotlike esetben érzékeny helyettesítő nem egyezik

-mérkőzés reguláris kifejezés

A -match üzemeltető lehetővé teszi, hogy ellenőrizze egy karakterlánc egy reguláris kifejezés alapján mérkőzés., Használja ezt, ha a helyettesítő minták nem elég rugalmasak az Ön számára.

 $value = 'S-ATX-SQL01' if ( $value -match 'S-\w\w\w-SQL\d\d') { # do something }

a regex minta alapértelmezés szerint megegyezik a karakterlánc bármely pontjával. Így megadhat egy olyan szubsztrátumot, amelyet így szeretne illeszteni:

 $value = 'S-ATX-SQL01' if ( $value -match 'SQL') { # do something }

a Regex egy összetett nyelv, amelyet érdemes megvizsgálni. Többet beszélek a-match – ról, valamint a regex használatának számos módjáról egy másik cikkben.,

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 }

ezt akkor használhatja, ha osztályokkal dolgozik, vagy különböző objektumokat fogad el a csővezeték felett. Lehet, hogy egy szolgáltatás vagy egy szolgáltatás neve, mint a bemenet. Ezután ellenőrizze, hogy van-e szolgáltatása, majd hozza el a szolgáltatást, ha csak a neve van.,

 if ( $Service -isnot ) { $Service = Get-Service -Name $Service }

variációk:

  • -is
  • -isnot nem

gyűjtés operátorok

Ha az előző operátorokat egyetlen értékkel használja, az eredmény$truevagy$false. Ezt kissé eltérően kezelik, ha kollekcióval dolgoznak. A gyűjtemény minden egyes elemét kiértékelik, és az operátor ehelyett visszaad minden értéket, amely a $trueértékre értékel.,

 PS> 1,2,3,4 -eq 3 3

Ez továbbra is helyesen működik a if nyilatkozatban. Tehát egy értéket az operátor ad vissza, akkor az egész állítás $true.

 $array = 1..6 if ( $array -gt 3 ) { # do something }

van egy kis csapda, amely itt rejtőzik a részletekben, amelyeket ki kell mutatnom. Ha így használja a -ne operátort, akkor könnyű tévesen nézni a logikát hátra., A -ne egy gyűjtemény visszatér $true ha bármely elem a gyűjtemény nem egyezik meg az értéket.

 PS> 1,2,3 -ne 4 1 2 3

Ez okos trükknek tűnhet, de vannak operátoraink-containsés-inakik ezt hatékonyabban kezelik, és-notcontains helyesen fog tenni, amit vársz.

– tartalmazza

a-contains operátor ellenőrzi a gyűjtemény az értéket., Amint talál egyezést, visszatér $true.

 $array = 1..6 if ( $array -contains 3 ) { # do something }

Ez az előnyös módja annak, hogy egy gyűjtemény tartalmazza az Ön értékét. A Where-Object ( vagy -eq) használata minden alkalommal végigjárja a teljes listát, és jelentősen lassabb lesz.,

Variációk:

  • -contains esetben érzéketlen mérkőzés
  • -icontains esetben érzéketlen mérkőzés
  • -ccontains esetben érzékeny mérkőzés
  • -notcontains esetben érzéketlen, nem illeszkedik
  • -inotcontains esetben érzéketlen, nem illeszkedik
  • -cnotcontains case sensitive nem egyezik

-a

A -in üzemeltető, mint a -contains üzemeltető kivéve a gyűjtemény a jobb oldalon.,

 $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.,

-nem

The -not az operátor $false $true vagy $true $false. Itt van egy példa, ahol egy műveletet akarunk végrehajtani, ha Test-Path $false.

 if ( -not ( Test-Path -Path $path ) )

a legtöbb operátor, akiről beszéltünk, van egy változata, ahol nem kell használni a -not operátort, de még mindig vannak idők, amikor használni szeretné.

!,

!-notálnévként használható.

 if ( -not $value ){} if ( !$value ){}

látni fogja, hogy a! többet használnak olyan emberek, akik más nyelvekről származnak, mint a C#. Én inkább írja ki, mert nehezen látom, ha gyorsan nézi a szkriptek.

– és

a kifejezéseket a-and operátorral kombinálhatja. Ha ezt megteszi, mindkét félnek $true kell lennie, hogy az egész kifejezés $truelegyen.,

 if ( ($age -gt 13) -and ($age -lt 55) )

ebben a példában a$age a bal oldalon 13 vagy annál idősebb, a jobb oldalon pedig 55-nél kisebb. Hozzáadtam extra zárójeleket, hogy világossá tegyem ebben a példában, de opcionálisak, mindaddig, amíg az expresszió egyszerű. Itt van ugyanaz a példa nélkülük.

 if ( $age -gt 13 -and $age -lt 55 )

Az értékelés balról jobbra történik. Ha az első elem $false értékel, akkor korán kilép, és nem végzi el a megfelelő összehasonlítást., Ez akkor hasznos, ha használat előtt meg kell győződnie arról, hogy létezik-e érték. Test-Path például hibát fog dobni, ha $null elérési utat ad.

 if ( $null -ne $path -and (Test-Path -Path $path) )

-vagy

The-orlehetővé teszi, hogy két kifejezést adjon meg, és visszatér$trueha ezek közül bármelyik$true.

 if ( $age -le 13 -or $age -ge 55 )

csakúgy, mint a -and operátor, az értékelés balról jobbra történik., Kivéve, ha az első rész $true, akkor az egész állítás $true, és nem dolgozza fel a kifejezés többi részét.

azt is vegye figyelembe, hogy a szintaxis hogyan működik ezen operátorok számára. Két külön kifejezésre van szüksége. Láttam, hogy a felhasználók megpróbálnak valami ilyesmit tenni $value -eq 5 -or 6 anélkül, hogy észrevennék hibájukat.

– xor exclusive vagy

Ez egy kicsit szokatlan. -xor csak egy kifejezés értékelhető $true., Tehát ha mindkét elem $falsevagy mindkét elem $true, akkor az egész kifejezés $false. Ennek másik módja a kifejezés csak $true, ha a kifejezés eredményei eltérőek.

ritka, hogy bárki valaha is használja ezt a logikai operátort, és nem tudok jó példát találni arra, hogy miért használnám.

Bitwise operátorok

Bitwise operátorok számításokat végeznek a biteken az értékeken belül, és ennek eredményeként új értéket hoznak létre., A bitenkénti operátorok tanítása túlmutat a cikken, de itt van a lista A them.

  • -band bináris MEG
  • -bor bináris, VAGY
  • -bxor bináris kizárólagos, VAGY
  • -bnot bináris NEM
  • -shl shift bal
  • -shr shift jobb

PowerShell kifejezések

használhatjuk a normál PowerShell belül a feltétel nyilatkozatot.,

 if ( Test-Path -Path $Path )

Test-Path$truevagy$false végrehajtásakor. Ez vonatkozik azokra a parancsokra is, amelyek más értékeket adnak vissza.

 if ( Get-Process Notepad* )

$trueha van visszaadott folyamat és$false ha nincs semmi., Teljesen érvényes a pipeline kifejezések vagy más PowerShell-kijelentések használata, mint például:

 if ( Get-Process | Where Name -eq Notepad )

ezek a kifejezések kombinálhatók egymással a-andés-or operátorok, de lehet, hogy ahhoz, hogy zárójelben megtörni őket al-kifejezések.

 if ( (Get-Process) -and (Get-Service) )

ellenőrzése $null

, amelynek nincs eredménye, vagy a $null érték a $false nyilatkozat., Ha kifejezetten a $null értéket ellenőrzi, akkor a legjobb gyakorlat a $null bal oldali elhelyezésére.

 if ( $null -eq $value )

nagyon kevés árnyalat van a$null értékek PowerShellben. Ha érdekli a mélyebb búvárkodás, van egy cikkem arról, amit tudni akartál a $null-ról.

változó hozzárendelés

majdnem elfelejtettem hozzáadni ezt, amíg Prasoon Karunan V emlékeztetett rá.,

normál esetben, ha értéket rendel egy változóhoz, az érték nem kerül át a csővezetékre vagy a konzolra. Ha változó hozzárendelést végez egy alkifejezésben, akkor az átkerül a csővezetékre.

 PS> $first = 1 PS> ($second = 2) 2

nézze meg, hogy a $first hozzárendelésnek nincs kimenete és a $second hozzárendelés? Ha egy hozzárendelés történik egy if utasítás, akkor végre, mint a $second hozzárendelés felett., Itt egy tiszta példa, hogyan lehetne használni:

 if ( $process = Get-Process Notepad* ) { $process | Stop-Process }

Ha$processkap egy értéket, akkor a nyilatkozat lesz$truemajd a$process leáll.

ügyeljen arra, hogy ne keverje össze ezt a -eq – val, mert ez nem egyenlő ellenőrzés. Ez egy homályosabb funkció, amelyet a legtöbb ember nem veszi észre, hogy így működik.,

alternatív végrehajtási útvonal

a if utasítás lehetővé teszi egy művelet megadását nem csak akkor, ha a nyilatkozat $true, hanem akkor is, ha $false. Itt jön létre a else utasítás.

else

aelse utasítás mindig az utolsó része a if nyilatkozat használatakor.

ebben a példában ellenőrizzük a$path fájlt, hogy megbizonyosodjon arról, hogy ez egy fájl. Ha megtaláljuk az aktát, áthelyezzük. Ha nem, akkor figyelmeztetést írunk., Ez a fajta elágazási logika nagyon gyakori.

beágyazott if

The ifand elseaz állítások szkriptblokkot tartalmaznak, így bármilyen PowerShell parancsot elhelyezhetünk bennük, beleértve egy másik if nyilatkozatot. Ez lehetővé teszi, hogy sokkal bonyolultabb logikát használjon.

ebben a példában először teszteljük a boldog utat, majd cselekedjünk rajta. Ha ez nem sikerül, újabb ellenőrzést végzünk, és részletesebb információkat adunk meg a felhasználónak.

eleff

nem korlátozódunk egyetlen feltételes ellenőrzésre., A if és else állításokat a elseif utasítás használatával együtt láncolhatjuk.

a végrehajtás felülről lefelé történik. Először a felső if utasítás kerül kiértékelésre. Ha ez $false, akkor a következő elseifvagy else a listában. Ez az utolsó else az alapértelmezett művelet, ha a többiek egyike sem tér vissza $true.,

switch

tis ponton meg kell említenem a switch nyilatkozatot. Ez egy alternatív szintaxis csinál több összehasonlítást egy értéket. Aswitch kifejezéssel megad egy kifejezést, és az eredményt több különböző értékhez hasonlítja. Ha az egyik ilyen érték mach, akkor a megfelelő kódblokk kerül végrehajtásra. Vessen egy pillantást erre a példára:

 $itemType = 'Role' switch ( $itemType ) { 'Component' { 'is a component' } 'Role' { 'is a role' } 'Location' { 'is a location' } }

három lehetséges érték, amelyek megfelelnek a $itemType., Ebben az esetben a Role és a is a role lesz végrehajtva. Egy nagyon egyszerű példát használtam csak azért, hogy némi expozíciót adjak a switch operátornak. Többet beszélek mindarról, amit valaha is tudni akartál a kapcsolási nyilatkozatról egy másik cikkben.

csővezeték

a csővezeték a PowerShell nagyon egyedi és fontos jellemzője. Minden olyan érték, amely nincs elnyomva vagy hozzárendelve egy változóhoz, a csővezetékbe kerül., A if lehetőséget ad arra, hogy kihasználjuk a csővezetéket oly módon, hogy az nem mindig nyilvánvaló.

 $discount = if ( $age -ge 55 ) { Get-SeniorDiscount } elseif ( $age -le 13 ) { Get-ChildDiscount } else { 0.00 }

minden szkriptblokk az eredményeket vagy az értéket a csővezetékbe helyezi. Ezután hozzárendeljük az if utasítás eredményét a $discount változóhoz. Ez a példa ugyanolyan könnyen hozzárendelhette ezeket az értékeket a $discount változóhoz közvetlenül az egyes szkriptblokkokban., Nem mondhatom, hogy ezt a if nyilatkozattal nagyon gyakran használom, de van egy példa, ahol ezt a közelmúltban használtam.

Array inline

van egy Invoke-SnowSql nevű függvényem, amely több parancssori argumentummal indít futtatható fájlt. Itt van egy klip, hogy a függvény, ahol építem a tömb érvek.

The $Debug and $Path a változók a végfelhasználó által biztosított függvény paraméterei. A tömb inicializálásán belül inicializálom őket., Ha a$Debug igaz, akkor ezek az értékek a$snowSqlParam a megfelelő helyre esnek. Ugyanez igaz a $Path változóra.

egyszerűsítse a komplex műveleteket

elkerülhetetlen, hogy olyan helyzetbe kerüljön, amely túl sok összehasonlítást tartalmaz ahhoz, hogy ellenőrizze, és az if utasítás gördül a képernyő jobb oldalán.

ezek nehezen olvashatók, így hajlamosabbak a hibákra. Van néhány dolog, amit tehetünk, hogy.,

vonal folytatása

van néhány operátor a PowerShellben, amely lehetővé teszi, hogy a parancsot a következő sorra csomagolja. A logikai operátorok -andés -or jó operátorok használni, ha azt szeretnénk, hogy megtörje a kifejezést több sorba.

még mindig sok minden folyik ott, de az egyes darabok saját vonalra helyezése nagy különbséget jelent. Általában csak akkor csinálom ezt, ha több mint két összehasonlítást kapok, vagy ha jobbra kell görgetnem a ligic bármelyikének olvasásához.,

előre kiszámított eredmények

ezt az állítást kivehetjük az if utasításból, és csak az eredményt ellenőrizhetjük.

Ez sokkal tisztább, mint az előző példa. Ön is lehetőséget kap arra, hogy egy változó nevet használjon, amely elmagyarázza, mi az, amit valóban ellenőriz. Ez is példa az öndokumentáló kódra, amely felesleges megjegyzéseket takarít meg.

több if állítás

ezt több állításra bonthatjuk, és egyenként ellenőrizhetjük őket. Ebben az esetben egy zászlót vagy egy nyomkövető változót használunk az eredmények kombinálásához.,

meg kellett fordítanom a logikát, hogy a zászló logikája megfelelően működjön. Minden értékelés egyedi if utasítás. Ennek az az előnye, hogy hibakereséskor pontosan meg tudja mondani, hogy mit csinál a logika. Ugyanakkor sokkal jobb verbositást tudtam hozzáadni.

a nyilvánvaló hátránya, hogy sokkal több kódot kell írni. A kód összetettebb, mivel egyetlen logikai vonalat vesz igénybe, és 25 vagy több sorba robbantja fel.

funkciók használata

az összes érvényesítési logikát egy függvénybe is áthelyezhetjük., Nézd meg, milyen tiszta ez egy pillanat alatt.

 if ( Test-SecureDriveConfiguration -ADUser $user ) { # do something }

még mindig létre kell hoznia a funkciót az érvényesítéshez, de ez sokkal könnyebbé teszi ezt a kódot. Ez megkönnyíti ezt a kódot tesztelni. A tesztekben a Test-ADDriveConfiguration hívásokat lehet kigúnyolni, ehhez a funkcióhoz csak két tesztre van szükség. Az egyik, ahol $true, a másik, ahol $false. A másik funkció tesztelése egyszerűbb lesz, mert olyan kicsi.,

ennek a függvénynek a teste továbbra is lehet az egysoros, vagy a felrobbant logika, amelyet az utolsó szakaszban használtunk. Ez jól működik mindkét forgatókönyv esetében, és lehetővé teszi, hogy később könnyen megváltoztassa ezt a végrehajtást.

hibakezelés

a if utasítás egyik nagyon fontos használata a hibafeltételek ellenőrzése, mielőtt hibákba ütközne. Jó példa arra, hogy ellenőrizze, hogy létezik-e mappa, mielőtt megpróbálja létrehozni.,

 if ( -not (Test-Path -Path $folder) ) { New-Item -Type Directory -Path $folder }

szeretném mondani, hogy ha kivételt vársz, akkor ez nem igazán kivétel. Tehát ellenőrizze az értékeket, és érvényesítse a feltételeket, ahol lehet.

Ha egy kicsit többet szeretne merülni a tényleges kivételkezelésbe, van egy cikkem mindenről, amit valaha is tudni akart a kivételekről.

záró szavak

a if a kijelentés egy ilyen egyszerű kijelentés, de a PowerShell nagyon alapvető darabja. Meg fogja találni magát ezzel többször szinte minden script írsz., Remélem, jobban megérted, mint korábban.

Share

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük