- 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.,
-
-eqcase-insensitive egyenlőség -
-ieqcase-insensitive egyenlőség -
-ceqesetben-é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:
-
-necase-érzéketlen nem egyenlő - case-sensitive nem egyenlő
-inecase-érzéketlen 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ékenynem 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:
-
-likecase-insensitive helyettesítő -
-ilikecase-insensitive helyettesítő -
-clikeesetben-érzékeny helyettesítő -
-notlikecase-insensitive helyettesítő nem egyezik -
-inotlikecase-insensitive helyettesítő nem egyezik -
-cnotlikeesetben-é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:
-
-matchcase-insensitive regex -
-imatchcase-insensitive regex -
-cmatchcase-sensitive regex -
-notmatchcase-insensitive regex not matched -
-inotmatchcase-insensitive regex not matched -
-cnotmatchcase-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 -
-isnotnem
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:
-
-containscase-insensitive mérkőzés -
-icontainscase-insensitive mérkőzés -
-ccontainsesetben-érzékeny mérkőzés -
-notcontainscase-insensitive nem egyezik -
-inotcontainscase-insensitive nem egyezik -
-cnotcontainsesetben-é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:
-
-incase-insensitive match -
-iincase-insensitive match -
-cincase-sensitive match -
-notincase-insensitive not matched -
-inotincase-insensitive not matched -
-cnotincase-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.
-
-bandbináris MEG -
-borbináris, VAGY -
-bxorbináris kizárólagos, VAGY -
-bnotbináris NEM -
-shlshift bal -
-shrshift 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.