- 05/23/2020
- 18 minuuttia lukea
-
-
j -
x -
t -
D -
s
-
Kuten monet muut kielet, PowerShell on tilinpäätös ehdollisesti täytäntöönpanovaltion koodia yourscripts. Yksi näistä lausunnoista on Ifin lausunto., Tänään sukellamme syvälle yhteen PowerShellin keskeisimmistä käskyistä.
Huom.
alkuperäinen versio tämän artikkelin ilmestyi blogi kirjoittanut @KevinMarquette. ThePowerShell-tiimi kiittää Keviniä tämän sisällön jakamisesta kanssamme. Tutustu hänen blogi atPowerShellExplained.com.
Ehdollinen suorittamiseen
– skriptejä usein täytyy tehdä päätöksiä ja suorittaa eri logiikka päätösten pohjalta.Tätä tarkoitan ehdollisella teloituksella., Sinulla on yksi lausuma tai arvo arvioida, sitten määrittää eri osa koodia perustuu että arviointi. Juuri näin iflausuma tekee.
jos lause
Tässä on perus esimerkki if selvitys:
$condition = $trueif ( $condition ){ Write-Output "The condition was true"}
ensimmäinen asia if lausunto ei on arvioida ilmaisun suluissa. Jos se evaluatesto $true, niin se suorittaa scriptblock jarruista., Jos arvo oli $false, niin se hyppää yli, että scriptblock.
edellisessä esimerkissä, if lausunto oli vain arvioida $condition muuttuja. Se oli$true ja se on toteutettu Write-Output komennon sisällä scriptblock.
joissakin kielissä, voit asettaa yhden koodirivin jälkeen if julkilausuma ja se getsexecuted. Näin ei ole Powershellissa. Sinun täytyy antaa täysi scriptblock henkselit forit toimimaan oikein.,
vertailuoperaattoreita
yleisin käyttö if lausunto on vertaamalla kahta kohdetta keskenään. Powershellilla on erikoisoperaattorit erilaisiin vertailuskenaarioihin. Kun käytät vertailuoperaattoria, vasemman puolen arvoa verrataan oikean puolen arvoon.
-eq tasa-arvo
-eq onko tasa-tarkista välillä kaksi arvoa varmista, että ne ovat keskenään yhtä suuret.,
$value = Get-MysteryValueif ( 5 -eq $value ){ # do something}
tässä esimerkissä otan tunnettu arvo 5 ja vertaamalla sitä minun $value nähdä, jos theymatch.
Yksi mahdollinen käyttötapaus on tarkistaa tilan arvo, ennen kuin otat toimiin. Voisit hankkia palvelun ja tarkistaa, että tila oli käynnissä ennen kuin soitit siihen Restart-Service .
Se on yhteistä muilla kielillä, kuten C# käyttää == tasa-arvon puolesta (ex: 5 == $value), mutta se ei toimi Powershellissa., Toinen yleinen virhe, että ihmiset tekevät on käyttää yhtäläisyysmerkki (esim:5 = $value), joka on varattu määrittämällä arvot muuttujille. Asettamalla tunnettu arvo theleft, se tekee tämän virheen hankalampi tehdä.
tällä operaattorilla (ja muilla) on muutamia variaatioita.,
-
-eqkirjainkoolla tasa-arvo -
-ieqkirjainkoolla tasa-arvo -
-ceqkirjainkoko tasa-arvo
-ne eivät ole yhtä
Monet operaattorit ovat liittyvä toimija, joka on tarkkailun osalta päinvastaiseen tulokseen. -ne todentaa, että arvot eivät vastaa toisiaan.
if ( 5 -ne $value ){ # do something}
tämän avulla voit varmistaa, että toiminta vain suorittaa, jos arvo ei ole 5., Hyvä käyttö-tapauksissa, joissa olisi tarkistaa, jos palvelu oli käynnissä tilassa ennen kuin yrität aloittaa sen.
Muunnelmia:
-
-nekirjainkoolla ei ole yhtä suuri -
-inekirjainkoolla ei ole yhtä suuri -
-cnekirjainkoko ei ole yhtä suuri
Nämä ovat käänteinen muunnelmia -eq. Ryhmitän nämä tyypit yhteen, kun luettelen variaatioita muille operaattoreille.,
-gt-ge -lt-le suurempaa kuin tai alle
Näitä operaattoreita käytetään, kun tarkistaa, jos arvo on suurempi tai pienempi kuin toinen arvo.-gt -ge -lt -le seistä suurempi kuin, GreaterThanOrEqual, LessThan, ja LessThanOrEqual.,syöjä kuin tai yhtä suuri, kirjainkoolla
-cge suurempi tai yhtä suuri kuin, kirjainkoko-lt alle-ilt alle, kirjainkoolla-clt alle, kirjainkoko-le pienempi tai yhtä suuri kuin-ile vähemmän kuin tai yhtä suuri, kirjainkoolla-cle vähemmän kuin tai yhtä suuri, kirjainkoko– en tiedä, miksi sinun pitäisi käyttää case-herkkä ja tunteettomia vaihtoehtoja näille toimijoille.,
-kuten jokeri otteluita
PowerShell on oma jokeri-pohjainen kaavoja syntaksi ja voit käyttää sitä -likeoperaattori. Nämä jokerikuviot ovat melko perusjuttuja.
-
?vastaa mitä tahansa yhtä merkkiä -
*vastaa mitä tahansa merkkien määrä
$value = 'S-ATX-SQL01'if ( $value -like 'S-*-SQL??'){ # do something}
Se on tärkeää huomauttaa, että malli vastaa koko merkkijono. Jos sinun täytyy matchsomething keskellä merkkijono, sinun täytyy paikka * molemmissa päissä thestring.,e”>
Muunnelmia:
-
-likekirjainkoolla jokeri -
-ilikekirjainkoolla jokeri -
-clikekirjainkoko jokeri -
-notlikekirjainkoolla jokeri ei yhdistetty -
-inotlikekirjainkoolla jokeri ei hyväksytty -
-cnotlikekirjainkoko jokeri ei hyväksytty
-ottelu säännöllinen lauseke
-match – operaattorin avulla voit tarkistaa merkkijono säännöllinen-lauseke-pohjainen ottelu., Käytä tätä, kun villikorttikuviot eivät ole tarpeeksi joustavia sinulle.
$value = 'S-ATX-SQL01'if ( $value -match 'S-\w\w\w-SQL\d\d'){ # do something}
regex-kuvio vastaa oletusarvoisesti missä tahansa merkkijonossa. Joten voit määrittää osajono, että haluat sovittaa, kuten tämä:
$value = 'S-ATX-SQL01'if ( $value -match 'SQL'){ # do something}
Regex on monimutkainen kieli sen omaa ja tutkimisen arvoinen. En puhua enemmän -match ja monia tapoja käyttää regex toisessa artikkelissa.,
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}
Voit käyttää tätä jos olet työskennellyt luokat tai hyväksyä erilaisia esineitä yli putken. Voisit olla joko palvelu tai palvelun nimi kuin syöte. Tarkista sitten, onko sinulla palvelua ja nouda palvelu, Jos sinulla on vain nimi.,
if ( $Service -isnot ){ $Service = Get-Service -Name $Service}
Muunnelmia:
-
-istyyppi -
-isnotei tyyppi
Kokoelma toimijat
Kun käytät edellinen toimijoiden kanssa yhden arvon, tulos on $true tai $false. Tämä jakaantui hieman eri tavalla, kun työskentelee kokoelma. Jokainen tuote kokoelmassa getsevaluated ja operaattori palauttaa jokaisen arvon, joka arvioi $true.,
PS> 1,2,3,4 -eq 33
Tämä toimii edelleen oikein if lausunto. Joten arvo palautetaan operaattorisi, sitten thewhole statement is $true.
$array = 1..6if ( $array -gt 3 ){ # do something}
Siellä on yksi pieni ansa piilossa yksityiskohtia täällä, että minun täytyy huomauttaa. Kun käytetään -ne – operaattoria näin, logiikkaa on helppo virheellisesti katsoa taaksepäin. Käyttäen -ne kanssa acollection palaa $true jos jokin kohde kokoelma ei vastaa arvo.,
PS> 1,2,3 -ne 4123
Tämä saattaa näyttää fiksu temppu, mutta meillä on toimijoita -contains ja -in, joka hoitaa tämän moreefficiently. Ja -notcontains tekee mitä odottaa.
sisältää
-contains operaattori tarkistaa kokoelman arvoa. Heti kun se löytää ottelun, itreturns $true.
$array = 1..6if ( $array -contains 3 ){ # do something}
Tämä on paras tapa nähdä, jos kokoelma sisältää oman arvon., Käyttäen Where-Object (tai-eq) kävelee koko lista joka kerta, ja on huomattavasti hitaampaa.,
Muunnelmia:
-
-containskirjainkoolla ottelu -
-icontainskirjainkoolla ottelu -
-ccontainskirjainkoko ottelu -
-notcontainskirjainkoolla ei ole hyväksytty -
-inotcontainskirjainkoolla ei ole hyväksytty -
-cnotcontainskirjainkoko ei hyväksytty
sisään
-in operaattori on aivan -contains operaattori paitsi kokoelma on oikealle puolelle.,
$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.,
ei
-not operaattori kääntää lauseke $false ja $true tai $true ja $false. Tässä esimerkki, jossa haluamme suorittaa toimia, kun Test-Path on $false.
if ( -not ( Test-Path -Path $path ) )
Useimmat toimijat puhuimme on muunnelma, jossa sinun ei tarvitse käyttää -notoperaattori. Mutta on vielä aikoja, jolloin siitä on hyötyä.
!, operaattori
Voit käyttää ! kuin alias -not.
if ( -not $value ){}if ( !$value ){}
saatat nähdä ! käytetään enemmän ihmisiä, jotka tulevat toisesta kieliä kuten C#. Kirjoitan sen mieluummin, koska minun on vaikea nähdä, kun katson nopeasti käsikirjoituksiani.
-ja
Voit yhdistää ilmaisuja -and operaattori. Kun teet, että, molemmin puolin on oltava$true koko ilmaus olisi $true.,
if ( ($age -gt 13) -and ($age -lt 55) )
esimerkissä $age täytyy olla 13 tai sitä vanhempia vasemmalla puolella ja alle 55 oikealla puolella. Lisäsin ylimääräisiä sulkeita, jotta se olisi selkeämpi tässä esimerkissä, mutta ne ovat valinnaisia niin kauan kuin ekspressio on yksinkertainen. Tässä on sama esimerkki ilman niitä.
if ( $age -gt 13 -and $age -lt 55 )
Arviointi tapahtuu vasemmalta oikealle. Jos ensimmäinen erä arvioi $false, se poistuu aikaisin ja ei tee oikeaa vertailua. Tämä on kätevä, kun sinun täytyy varmistaa arvo on olemassa ennen kuin käytät sitä., Esimerkiksi Test-Path heittää virheen, jos annat sille $null polku.
if ( $null -ne $path -and (Test-Path -Path $path) )
-tai
-or avulla voit määrittää kaksi ilmauksia ja palautus $true jos jompikumpi heistä on$true.
if ( $age -le 13 -or $age -ge 55 )
Aivan kuten -and operaattori, arviointi tapahtuu vasemmalta oikealle., Paitsi, että jos ensimmäinen osa on $true, niin koko lausunto on $true ja se ei ole prosessin loppu theexpression.
huomaa myös, miten syntaksi toimii näille operaattoreille. Tarvitset kaksi erillistä ilmaisua. Ihave nähnyt käyttäjien yrittävän tehdä jotain tällaista $value -eq 5 -or 6 tajuamatta virhettään.
-xor exclusive tai
Tämä on hieman epätavallinen. -xor sallii vain yhden ilmaisun arvioida $true., Joten jos bothitems ovat $false tai molemmat kohteet ovat $true, niin koko ilme on $false. Toinen tapa ihmisoikeudet otetaan tässä on ilmaisu on vain $true kun tulokset ilmaisu on eri.
on harvinaista, että kukaan koskaan käyttäisi tätä loogista operaattoria, enkä keksi hyvää esimerkkiä kuin towhy I would ever use it.
Bitwise operaattorit
Bitwise operaattorit suorittaa laskutoimituksia bittiä sisällä arvot ja tuottaa uutta arvoa, kuten tämä., Opetus bitwise operaattorit on soveltamisalan ulkopuolella tämän artikkelin, mutta tässä on luettelo thethem.
-
-bandbinary JA -
-borbinary TAI -
-bxorbinary yksinomainen TAI -
-bnotbinary OLE -
-shlvasemmalla -
-shrsiirrä oikealle
PowerShell ilmaisuja,
Voimme käyttää normaalia PowerShell sisällä kunnon selvitys.,
if ( Test-Path -Path $Path )
Test-Path palaa $true tai $false kun se suorittaa. Tämä koskee myös komentoja, jotka palauttavatmuut arvot.
if ( Get-Process Notepad* )
arvioi $true jos siellä on palannut prosessi ja $false jos ei’sn pienempi asia., Se’sperfectly voimassa käyttää putki-ilmaisuja tai muita PowerShell lausuntoja, kuten tämä:
if ( Get-Process | Where Name -eq Notepad )
Nämä ilmaisut voidaan yhdistää toistensa kanssa -and ja -or toimijat, mutta mayhave käyttää suluissa rikkoa ne subexpressions.
if ( (Get-Process) -and (Get-Service) )
Tarkistaminen $null
Ottaa ei tulos tai $null arvo arvo $false if lausunto., Kun checkingspecifically varten $null, se on parasta sijoittaa $null vasemmalla puolella.
if ( $null -eq $value )
On olemassa melko muutamia vivahteita käsiteltäessä $null arvot PowerShell. Jos olet kiinnostunut sukeltamaan syvemmälle, minulla on artikkeli kaikesta, mitä halusit tietää $nullista.
muuttujamääritykset
melkein unohdin lisätä tämän yhden, kunnes Prasoon Karunan V muistutti minua siitä.,
if ($process=Get-Process notepad -ErrorAction ignore) {$process} else {$false}
Normaalisti kun voit määrittää arvon muuttujalle arvo ei ole kulunut päälle putki orconsole. Kun teet muuttuva toimeksianto sub-lauseke, se kyllä siirtyy thepipeline.
PS> $first = 1PS> ($second = 2)2
Katso, miten $first tehtävä ei ole tuotos ja $second tehtävä ei? Kun assignmentis tehdä if lausunto, se suorittaa aivan kuten $second tehtävän edellä., Tässä on cleanexample siitä, miten voit käyttää sitä:
if ( $process = Get-Process Notepad* ){ $process | Stop-Process}
– Jos $process saa määritetty arvo, niin lausunto on $true ja $process saa pysäyttää.
varmista, että sinulla älä sekoita tätä -eq koska tämä ei ole tasa-arvoa sekin. Tämä on moreobscure ominaisuus, että useimmat ihmiset eivät ymmärrä, toimii tällä tavalla.,
Vaihtoehtoinen polkuun
if selvitys avulla voit määrittää toiminnon, ei vain silloin, kun selvitys on $true myös, kun se on $false. Tällöin tulee esiin else lausuma.
muuta
else lausunto on aina viimeinen osa if ilmoitus, kun sitä käytetään.
tässä esimerkissä tarkistamme $path varmistaaksemme, että se on tiedosto. Jos löydämme tiedoston, siirrämme sen. Jos ei, kirjoitamme varoituksen., Tällainen haarautumislogiikka on hyvin yleistä.
Sisäkkäisiä jos –
if ja else lausunnot ottaa script estää, joten emme voi asettaa mitään PowerShell komento insidethem, mukaan lukien toinen if lausunto. Näin voit hyödyntää paljon monimutkaisempaa logiikkaa.
tässä esimerkissä testaamme ensin onnellista polkua ja ryhdymme sitten toimiin sen suhteen. Jos tämä ei onnistu, teemme muut tarkistaa ja antaa tarkempia tietoja käyttäjälle.
elsef
emme rajoitu vain yhteen ehdolliseen tarkistukseen., Voimme ketju if ja else statementstogether sijaan pesivien niitä käyttämällä elseif lausunto.
toteutus tapahtuu ylhäältä alas. Ylin if lausuma arvioidaan ensin. Jos tämä $false, niin se siirtyy seuraavalle elseif tai else luettelossa. Tuo viimeinen else on oletuksena toimia, jos muut paluu $true.,
vaihto
tässä vaiheessa, minun täytyy mainita switch lausunto. Se tarjoaa vaihtoehtoisen syntaksin doingmultiple vertailuja arvo. Jossa switch, voit määrittää ilmaus ja että tulos getscompared useita eri arvoja. Jos jokin näistä arvoista vastaa toisiaan, vastaava koodilohko on määritetty. Katsokaa tätä esimerkkiä:
$itemType = 'Role'switch ( $itemType ){ 'Component' { 'is a component' } 'Role' { 'is a role' } 'Location' { 'is a location' }}
On olemassa kolme mahdollista arvoa, joka voi ottelu $itemType. Tällöin se vastaa Role., Käytin yksinkertaista esimerkkiä vain antaakseni sinulle jonkin verran altistusta switch operaattorille. Puhun enemmän kaikesta, mitä olet koskaan halunnut tietää switch-lausunnosta toisessa artikkelissa.
Putki
putki on ainutlaatuinen ja tärkeä ominaisuus PowerShell. Kaikki arvo, joka ei ole suppressed tai Osoitettu muuttuja saa sijoitetaan putkistoon. if tarjoaa meille tavan ottaa putkiston edut tavalla, joka ei ole aina itsestään selvää.,
$discount = if ( $age -ge 55 ){ Get-SeniorDiscount}elseif ( $age -le 13 ){ Get-ChildDiscount}else{ 0.00}
Jokaisen käsikirjoituksen lohko on saattaa tulokset komentoja tai arvo putkeen. Sitten me assignthe tulos if lausunto $discount muuttuja. Että esimerkiksi olisi yhtä easilyassigned niitä arvoja $discount muuttuja suoraan kunkin scriptblock. En voi sanoa, että käytän tätä usein if – lausahduksella, mutta minulla on esimerkki, jossa käytin tätä äskettäin.,
Array inline
minulla on toiminto nimeltään Vedota-SnowSql, joka käynnistää suoritettavan useita komento-linearguments. Tässä on leikkeen, että toiminto, jossa rakennan erilaisia argumentteja.
$Debug ja $Path muuttujia ovat parametrit toiminto, joka tarjoaa loppukäyttäjälle.Arvioin ne inline sisällä alustus minun array. Jos $Debug on totta, niin ne valuesfall osaksi $snowSqlParam oikeaan paikkaan. Sama pätee $Path muuttuja.,
Yksinkertaistaa monimutkaiset toiminnot
on väistämätöntä, että et törmätä tilanteeseen, että on liian monia vertailuja tarkistaa jaIf selvitys rullaa pois oikealla puolella näytön.
ne voivat olla vaikealukuisia ja tehdä virheitä herkemmin. Wecan tekee asialle muutamia asioita.
Line jatkoa
On joitakin toimijoita PowerShell, että voit kääri sinut komentoa seuraavalle riville., Se logicaloperators -and ja -or ovat hyviä toimijat voivat käyttää, jos haluat rikkoa oman ilmaisun intomultiple linjat.
siellä on vielä paljon meneillään, mutta jokaisen kappaleen sijoittamisella omalle rivilleen on iso merkitys.Käytän tätä yleensä, kun saan yli kaksi vertailua tai jos minun täytyy vierittää oikealle lukea mitään logiikkaa.
Pre-laskemalla tulokset
Voimme ottaa, että lausunto ulos if lausunto ja vain tarkistaa tuloksen.
Tämä vain tuntuu paljon puhtaammalta kuin edellinen esimerkki., Saat myös mahdollisuuden käyttää avariable nimi, joka selittää, mitä se on, että olet todella tarkistaa. Tämä on myös ja esimerkki itse dokumentoivasta koodista, joka säästää turhia kommentteja.
Useita, jos lausunnot
Emme voi rikkoa tätä ylös useita lausuntoja ja tarkistaa ne yksi kerrallaan. Tässä tapauksessa, käytämme aflag tai seurantamuuttuja yhdistää tuloksia.
jouduin kääntämään logiikan, jotta lippulogiikka toimisi oikein. Jokainen arviointi on yksilöllinen if lausuma., Tämän etuna on se, että kun vianetsintä, voit tellexactly mitä logiikka tekee. Pystyin lisäämään paljon parempaa sanahelinää samaan aikaan.
ilmeinen haittapuoli on, että se on niin paljon enemmän koodia kirjoittaa. Koodi on monimutkaisempaa tarkastella ateas se vie yhden rivin logiikkaa ja räjähtää se 25 tai enemmän riviä.
funktioilla
voimme myös siirtää kaiken validointilogiikan funktioksi. Katso, miten puhtaalta tämä näyttää.,
if ( Test-SecureDriveConfiguration -ADUser $user ){ # do something}
vielä luoda toiminto tehdä validointi, mutta se tekee tämän koodin paljon helpompaa työskentelyn kanssa. Tämä koodi on helpompi testata. Teidän testejä, voit pilkata puhelunTest-ADDriveConfiguration ja tarvitset vain kaksi testiä, jotta tätä toimintoa. Yksi, missä se palaa$true ja yksi, jossa se palaa $false. Toisen toiminnon testaus on yksinkertaisempaa, koska se onso pieni.
kehon että toiminta voi silti olla, että yksi-liner aloitimme tai räjähti logiikka me käytettiin viime jaksossa., Tämä toimii hyvin molemmissa skenaarioissa ja voit helposti muuttaa asennetta myöhemmin.
Virheiden käsittely
Yksi tärkeä käyttö if lausunto on tarkistaa virheiden varalta, ennen kuin suoritat intoerrors. Hyvä esimerkki on tarkistaa, onko kansio jo olemassa ennen kuin yrität luoda sitä.
if ( -not (Test-Path -Path $folder) ){ New-Item -Type Directory -Path $folder}
– haluan sanoa, että jos odotat poikkeus tapahtuu, niin se ei ole todellakaan poikkeus. Tarkista siis arvosi ja vahvista olosuhteesi siellä, missä voit.,
Jos haluat sukeltaa hieman enemmän varsinaiseen poikkeusten käsittelyyn, minulla on artikkeli siitä, mitä olet koskaan halunnut tietää poikkeuksista.
viimeiset sanat
if lausunto on tällainen yksinkertainen toteamus, mutta se on olennainen pala PowerShell. Käytät tätä useita kertoja lähes jokaisessa kirjoituksessasi. Toivottavasti osaat paremmin kuin ennen.