- 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 aif
utasí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ő - case-sensitive nem egyenlő
-ine
case-érzéketlen nem egyenlő
ezek a -eq
inverz 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 -like
operá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 $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 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-Path
hibá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. -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
. 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
$true
vagy $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 $first
hozzá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 else
utasí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ő elseif
vagy else
a listában. Ez utóbbi else
aalapé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 $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
– 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.