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ú
- -eq az egyenlőség
- 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 ascriptblock
A zárójelben. Ha az érték$false
volt, akkor átugorja a scriptblock-ot.az előző példában a
if
utasítás csak a$condition
változót értékelte.$true
és aWrite-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 a
5
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
- !,pressions
-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 nem
5
., 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
-eq
inverz 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
- -nem
-
-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$true
vagy$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-in
akik 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 $true
legyen.,
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-or
lehetővé teszi, hogy két kifejezést adjon meg, és visszatér$true
ha 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 $false
vagy 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
$true
vagy$false
végrehajtásakor. Ez vonatkozik azokra a parancsokra is, amelyek más értékeket adnak vissza.
if ( Get-Process Notepad* )
$true
ha 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$process
kap egy értéket, akkor a nyilatkozat lesz$true
majd 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 if
and else
az á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ő elseif
vagy 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.