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

  • 05/23/2020
  • 18 perc olvasni
    • j
    • x
    • t
    • D
    • s

Mint sok más nyelven, PowerShell van kimutatások feltételesen végrehajtó kód yourscripts. Az egyik ilyen kijelentés az If nyilatkozat., Ma mélyen belemerülünk az egyikbea PowerShell legalapvetőbb parancsai.

Megjegyzés

a cikk eredeti változata megjelent a @KevinMarquette által írt blogban. ThePowerShell csapat köszönöm Kevin megosztására ezt a tartalmat velünk. Kérjük, nézd meg a blogját atPowerShellExplained.com.

feltételes végrehajtás

a szkripteknek gyakran döntéseket kell hozniuk, és eltérő logikát kell végrehajtaniuk e döntések alapján.Ezt értem a feltételes kivégzés alatt., Van egy utasítás vagy érték, amelyet értékelni kellaz értékelés alapján készítsen egy másik kódrészletet. Pontosan ezt teszi aifutasítás.

az if állítás

itt van egy alapvető példa aif nyilatkozat:

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

az első dolog aif nyilatkozat zárójelben értékeli a kifejezést. Ha a $true értéket értékeli, akkor a scriptblock értéket hajtja végre 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, és ez leszexecuted. PowerShellben nem ez a helyzet. Meg kell adnia egy teljesscriptblock fogszabályzóval a megfelelő működéshez.,

összehasonlító operátorok

aif utasítás leggyakoribb használata két elem összehasonlítása egymással. A PowerShell rendelkezikspeciális operátorok különböző összehasonlítási forgatókönyvekhez. Ha összehasonlító operátort használ, az értéka bal oldalon összehasonlítjuk a jobb oldali értékkel.

– EQ az egyenlőségért

a -eq két érték közötti egyenlőséget ellenőrzi annak biztosítása érdekében, hogy egyenlőek legyenek egymással.,

$value = Get-MysteryValueif ( 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 felhasználási eset az érték állapotának ellenőrzése, mielőtt végrehajtaná a műveletet. A Restart-Service cím megadása előtt ellenőrizhet egy szolgáltatást, és ellenőrizheti, hogy az állapot fut-e rajta.

más nyelveken, például a C# – ban gyakori a == használata az egyenlőségért (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 theleft, teszi ezt a hibát több kínos, hogy.

ennek az operátornak (és másoknak) van néhány változata.,

  • -eq case-insensitive egyenlőség
  • -ieq case-insensitive egyenlőség
  • -ceq esetben-érzékeny egyenlőség

-ék nem egyenlő

Sok szereplők kapcsolódó üzemeltető ellenőrzi az ellenkező eredményt. -ne ellenőrzi, hogy az értékek nem egyenlőek egymással.

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

ezzel meggyőződhet arról, hogy a művelet csak akkor hajtható végre, ha az érték nem 5., Jó használat-olyan esetek, aholellenőrizze, hogy egy szolgáltatás futó állapotban van-e, mielőtt megpróbálja elindítani.

variációk:

  • -ne case-érzéketlen nem egyenlő
  • -inecase-érzéketlen nem egyenlő

  • case-sensitive nem egyenlő

ezek a -eqinverz változatai. Ezeket a típusokat csoportosítom, amikor felsorolom a variációkatmá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 -gt -ge -lt -le a “GreaterThan”, “GreaterThanOrEqual”, “LessThan” és “LessThanOrEqual” jelölések.,evő, mint vagy egyenlő, case-insensitive

  • -cge nagyobb vagy egyenlő, az érzékeny
  • -lt kevesebb, mint
  • -ilt kevesebb, mint case-insensitive
  • -clt kevesebb, mint esetben-érzékeny
  • -le kisebb vagy egyenlő
  • -ile kisebb vagy egyenlő, case-insensitive
  • -cle kisebb vagy egyenlő, az érzékeny
  • 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 -likeoperátor. Ezek helyettesítő minták meglehetősen alapvető.

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

    fontos kiemelni, hogy a minta megfelel a teljes karakterláncnak. Ha meg kell egyeznie valamivel a karakterlánc közepén, akkor a * – ot kell elhelyeznie a karakterlánc mindkét végén.,e”>

    Variációk:

    • -like case-insensitive helyettesítő
    • -ilike case-insensitive helyettesítő
    • -clike esetben-érzékeny helyettesítő
    • -notlike case-insensitive helyettesítő nem egyezik
    • -inotlike case-insensitive 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-alapú match., Használja eztamikor 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 a karakterlánc bármely pontjára illeszkedik. Így megadhat egy olyan alstringet, amelyet így szeretne illeszteni:

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

    a Regex egy saját, összetett nyelv, amelyet érdemes megvizsgálni. Többet beszélek a-match ésa regex használatának számos módja 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 can 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ásÉs hozza le 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

    a korábbi operátorok használatakor egyetlen érték esetén az eredmény $true vagy $false. Ez kissé eltérő, ha kollekcióval dolgozik. Minden elem a gyűjtemény getsevaluated és az Üzemeltető visszatér minden értéket, amely értékeli, hogy $true.,

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

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

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

    van egy kis csapda, amely a részletekben rejtőzik, amit ki kell mutatnom. Ha így használja a -ne operátort, könnyű tévesen nézni a logikát hátra. A -ne használata acollection returns $true ha a gyűjtemény bármely eleme nem felel meg az Ön értékének.,

    PS> 1,2,3 -ne 4123

    Ez úgy néz ki, mint egy okos trükk, de vannak olyan operátorok -containsés -in, amelyek ezt jobban kezelik. És -notcontains azt teszi, amit vársz.

    – tartalmaz

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

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

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

    Variációk:

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

    -a

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

    $array = 1..6if ( 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.,

    -not

    The -not operator flips an expression from $false to $true vagy from $true . Itt van egy példa, ahol egy műveletet akarunk végrehajtani, amikor Test-Path$false.

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

    a legtöbb operátor beszéltünk van egy variáció, ahol nem kell használni a -not operátor. De még mindig vannak idők, hogy hasznos.

    !, a

    operátor ! -notálnéven használható.

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

    lehet látni ! használt több ember, hogy jön egy másik nyelven, mint a C#. Inkább beírom az itout-ot, mert nehezen látom, amikor gyorsan Megnézem a szkriptjeimet.

    – é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 kevesebb, mint 55. További zárójeleket adtam hozzá, hogy világosabb legyen ebben a példában, de opcionálisak, 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 értéke $false, akkor kilép a korai anddoesn ‘ t végezze el a megfelelő összehasonlítást. Ez akkor hasznos, ha előbb meg kell győződnie arról, hogy létezik-e értékhasználja., Például a Test-Pathhibát dob, ha $null elérési utat ad.

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

    – vagy

    The -or lehetővé teszi, hogy két kifejezést adjon meg, és $true ha ezek közül bármelyik$true.

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

    csakúgy, mint a -and operátorral, 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 többi expresszió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. -xorcsak egy kifejezés értékelhető $true., Tehát ha mindkét elem $false vagy mindkét elem $true, akkor az egész kifejezés $false. Egy másik módja annak, hogy ezt a kifejezést 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 valaha is használnám.

    Bitwise operátorok

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

    • -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 visszatérnekegyéb értékek.

    if ( Get-Process Notepad* )

    $true, ha van visszaadott folyamat és $false ha van valami., Teljesen érvényes a következő pipeline kifejezések vagy más PowerShell kijelentések használata:

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

    ezek a kifejezések kombinálhatók egymással a -andés -or operátorokkal, de előfordulhat, hogy zárójelet kell használnia, hogy részkifejezésekké bontsa őket.

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

    ellenőrzése $null

    nincs eredmény vagy a $null értékértékelés $false a if nyilatkozat., A $null ellenőrzésekor a legjobb gyakorlat a $null bal oldali elhelyezése.

    if ( $null -eq $value )

    nagyon sok árnyalat van a $null értékek PowerShellben. Ha mélyebbre akarsz merülni, van egy cikkem mindenrő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á.,

    if ($process=Get-Process notepad -ErrorAction ignore) {$process} else {$false}

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

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

    nézze meg, hogy a $firsthozzárendelésnek nincs kimenete, és a $second hozzárendelés? Ha egy if nyilatkozatban van hozzárendelve, akkor ugyanúgy végrehajtja, mint a fenti $second hozzárendelés., Itt van egy cleanexample, hogyan lehetne használni:

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

    Ha $process kap egy értéket, akkor a nyilatkozat $true és $process leáll.

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

    alternatív végrehajtási útvonal

    a if utasítás lehetővé teszi, hogy adjon meg egy műveletet nem csak akkor, ha a nyilatkozat $true, butalso, ha ez $false. Itt jön létre a else utasítás.

    else

    The elseutasítás mindig az utolsó része aif 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, figyelmeztetést írunk., Ez a fajta elágazási logika nagyon gyakori.

    Beágyazott, ha

    A if vagy else kimutatások egy script, szóval valaki PowerShell parancs insidethem, így egy 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, akkor egy másik ellenőrzést végzünk, és részletesebb információt adunk a felhasználónak.

    eleff

    nem korlátozódunk egyetlen feltételes ellenőrzésre., A if és else

    elseif utasítás használatával láncolhatjuk őket.

    a végrehajtás felülről lefelé történik. Először a felső if nyilatkozatot értékeljük. Ha thatis $false, akkor a következő elseifvagy else a listában. Ez utóbbi elseaalapértelmezett művelet, ha a többiek egyike sem tér vissza $true.,

    switch

    Ezen a ponton meg kell említenem a switch nyilatkozatot. Ez egy alternatív szintaxist biztosít a doingmultiple összehasonlításokhoz egy értékkel. A switch segítségével megadhat egy kifejezést, és az eredmény több különböző értékhez lesz hozzárendelve. Ha az egyik érték egyezik, akkor a megfelelő kódblokk vankivetve. 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értékkel egyezik., Egy egyszerű példát használtam csak azért, hogy némi expozíciót adjak a switch operátornak. Többet beszélek mindenről, amit valaha is tudni akart a kapcsolási nyilatkozatról egy másik cikkben.

    csővezeték

    a csővezeték a PowerShell egyedülálló és fontos jellemzője. Minden olyan érték, amely nincs elnyomvagy egy változóhoz van rendelve, a csővezetékbe kerül. Aif lehetőséget biztosít számunkra a csővezeték előnyeinek kihasználására olyan módon, amely 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 a if $discount változó utasításainak eredményét. Ez a példa ugyanolyan könnyen lehetett, hogy ezeket az értékeket a $discount változóhoz rendelte közvetlenül az egyes szkriptblokkokban. Nem mondhatom, hogy ezt gyakran használom a if nyilatkozattal, de van egy példa, ahol ezt a közelmúltban használtam.,

    Array inline

    van egy függvény úgynevezett Invoke-SnowSql, amely elindítja a futtatható több parancs-linearguments. Itt van egy klip, hogy a függvény, ahol építem a tömb érvek.

    The $Debugand $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 – ba kerülnek a megfelelő helyen. 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, hogy ellenőrizze aIf utasítás görgők 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 logicaloperators -andés -or jó operátorok használni, ha meg akarja szakítani a kifejezéstöbb sor.

    még mindig sok minden folyik ott, de az egyes darabok saját vonalra helyezése nagy különbséget jelent.Ezt általában akkor használom, ha több mint két összehasonlítást kapok, vagy ha jobbra kell görgetnem a logika bármelyikét.

    előre kiszámított eredmények

    ezt a kijelentést kivehetjük a 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 változékony 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 az eredmények kombinálásához aflag vagy nyomkövető változót használunk.

    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 nyilatkozat., Ennek az az előnye, hogy amikor hibakeresést végez, meg tudja mondanipontosan, 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, ha megnézzük, 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 néz aglance.,

    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 aTest-ADDriveConfiguration hívásra lehet gú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, mert ezolyan kicsi.

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

    hibakezelés

    a if utasítás egyik fontos használata, hogy ellenőrizze a hibafeltételeket, mielőtt befut.hibák. 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}

    szeretem azt mondani, hogy ha kivételre számít, akkor ez nem igazán kivétel. Így 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 cikkemmindent, amit valaha is tudni akartál a kivételekről.

    záró szavak

    a if a kijelentés egy ilyen egyszerű kijelentés, de a PowerShell alapvető darabja. Ezt többször is felhasználhatja szinte minden írandó szkriptben. Remélem, jobban megérted, mint korábban.

    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