Kaikki mitä olet halunnut tietää siitä, jos lause

  • 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.,

  • -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ä -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:

    • -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ää -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.

    • -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.

    Vastaa

    Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *