- 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 if
lausuma 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.,
-
-eq
kirjainkoolla tasa-arvo -
-ieq
kirjainkoolla tasa-arvo -
-ceq
kirjainkoko 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:
-
-ne
kirjainkoolla ei ole yhtä suuri -
-ine
kirjainkoolla ei ole yhtä suuri -
-cne
kirjainkoko 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ä -like
operaattori. 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:
-
-like
kirjainkoolla jokeri -
-ilike
kirjainkoolla jokeri -
-clike
kirjainkoko jokeri -
-notlike
kirjainkoolla jokeri ei yhdistetty -
-inotlike
kirjainkoolla jokeri ei hyväksytty -
-cnotlike
kirjainkoko 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:
-
-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}
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:
-
-is
tyyppi -
-isnot
ei 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:
-
-contains
kirjainkoolla ottelu -
-icontains
kirjainkoolla ottelu -
-ccontains
kirjainkoko ottelu -
-notcontains
kirjainkoolla ei ole hyväksytty -
-inotcontains
kirjainkoolla ei ole hyväksytty -
-cnotcontains
kirjainkoko 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:
-
-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.,
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ää -not
operaattori. 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.
-
-band
binary JA -
-bor
binary TAI -
-bxor
binary yksinomainen TAI -
-bnot
binary OLE -
-shl
vasemmalla -
-shr
siirrä 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.