Powershell: Kaikki mitä olet halunnut tietää JOS lause

Kuten monet muut kielet, PowerShell on tilinpäätös ehdollisesti täytäntöönpanovaltion koodia skriptejä. Yksi näistä lausunnoista on Ifin lausunto. Tänään sukellamme syvälle yhteen PowerShellin keskeisimmistä käskyistä.,

  • Indeksi
  • Ehdollinen toteutus
  • jos lause
  • vertailuoperaattoreita
    • -eq tasa-arvo
      • -ne eivät ole yhtä suuri
    • -gt-ge -lt-le suurempaa kuin tai alle
    • -kuten jokeri-otteluissa
    • -ottelu säännöllinen lauseke
    • -on tyyppiä
  • Kokoelma toimijat
    • sisältää
    • -in
  • Loogisia operaattoreita
    • ei
      • !,pressions
        • Tarkastus varten $null
        • muuttujamääritykset
      • Vaihtoehtoinen polkuun
        • muuta
        • Sisäkkäiset jos –
        • if
        • kytkin
      • Putki
        • Array inline
      • Yksinkertaistaa monimutkaisia operaatioita
        • Line jatkoa
        • Ennen laskettaessa tuloksia
        • Useita, jos lausunnot
        • toimintojen Käyttäminen
      • Virheiden käsittely
      • viimeiset sanat

      Ehdollinen suorittamiseen

      Skriptejä tarvitaan usein tehdä päätöksiä ja suorittaa eri logiikka päätösten pohjalta., Tätä tarkoitan ehdollisella teloituksella. Sinulla on yksi lausunto tai arvo arvioida, sitten suorittaa eri koodiosat perustuu että arviointi. Juuri näin if lausuma tekee.

      jos lause

      Tässä on hyvin yksinkertainen esimerkki if selvitys:

       $condition = $true if ( $condition ) { Write-Output "The condition was true" }

      ensimmäinen asia if lausunto ei on arvioida ilmaisun suluissa., Jos se arvioi, että $true, niin se tulee suorittaa scriptblock jarruista. Jos arvo olisi $false, se hyppäisi tuon Skripalin yli.

      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 teloitetaan., Näin ei ole Powershellissa. Sinun täytyy toimittaa täysi scriptblock henkselit, joilla se toimii oikein.

      vertailuoperaattoreita

      yleisin asia, sinun tulee käyttää if lausunto on vertaamalla kahta kohdetta keskenään. Powershellissa on erikoisoperaattoreita 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-MysteryValue if ( 5 -eq $value ) { # do something }

      tässä esimerkissä käytän tunnettu arvo 5 ja vertaamalla sitä minun $value nähdä, jos ne vastaavat.

      Yksi mahdollinen usecase on tarkistaa tilan arvo, ennen kuin otat toimiin. Voit saada palvelun ja tarkistaa, että tila oli käynnissä ennen kuin soitit siitä Restart-Service.,

      Se on yhteistä muilla kielillä, kuten C# käyttää == tasa-arvon puolesta (ex: 5 == $value), mutta se ei toimi powershell. 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. Kun asetat tunnetun arvosi vasemmalle, se tekee siitä erehdyksestä kiusallisemman tehdä.

      tällä operaattorilla (ja muilla) on muutamia variaatioita.,

      • -eq kirjainkoko tasa-arvo
      • -ieq kirjainkoko tasa-arvo
      • -ceq kirjainkoko tasa-arvo

      -ne eivät ole yhtä

      Monet operaattorit ovat liittyvä toimija, joka on tarkkailun osalta päinvastaiseen tulokseen. -ne tarkistaa 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 käynnistää sitä.

      Muunnelmia:

      • -ne kirjainkoko ei ole yhtä suuri
      • -ine kirjainkoko ei ole yhtä suuri
      • -cne kirjainkoko ei ole yhtä suuri

      Nämä ovat vain käänteinen muunnelmia -eq. Ryhmitän nämä tyypit yhteen, kun luettelen variaatioita muille operaattoreille.,

      -gt-ge-lt-le yli tai alle

      näitä operaattoreita käytetään tarkistettaessa, onko arvo suurempi vai pienempi kuin toinen arvo. -gt -ge -lt -le seistä suurempi kuin, GreaterThanOrEqual, LessThan, ja LessThanOrEqual.,syöjä kuin tai yhtä suuri, kirjainkoko

    • -cge suurempi tai yhtä suuri, isot ja pienet kirjaimet
    • -lt alle
    • -ilt vähemmän kuin kirjainkoko
    • -clt alle, kirjainkoko
    • -le pienempi tai yhtä suuri kuin
    • -ile vähemmän kuin tai yhtä suuri, kirjainkoko
    • -cle vähemmän kuin tai yhtä suuri, kirjainkoko

    – en tiedä, miksi et käyttäisi tapauksessa herkkä ja tunteettomia vaihtoehtoja näille toimijoille.,

    -kuten jokeri-otteluissa

    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 sovittaa jotain keskellä merkkijono, sitten sinun täytyy paikka * molemmissa päissä merkkijono.,iv>

Muunnelmia:

  • -like kirjainkoko jokeri
  • -ilike kirjainkoko jokeri
  • -clike kirjainkoko jokeri
  • -notlike kirjainkoko jokeri ei hyväksytty
  • -inotlike kirjainkoko 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 täsmää tahansa merkkijono oletuksena. 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 are able to 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. Syötteenä voi olla joko palvelu tai palvelun nimi. 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ä käsitellään hieman eri tavalla, kun työskentelee kokoelma. Jokainen kokoelman kohde arvioidaan ja operaattori palauttaa sen sijaan jokaisen arvon, joka arvioi $true.,

 PS> 1,2,3,4 -eq 3 3

Tämä toimii edelleen oikein if lausunto. Joten arvo palautetaan operaattorin, niin koko lauseke on $true.

 $array = 1..6 if ( $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 kokoelma palaa $true jos jokin kohde kokoelma ei vastaa arvo.

 PS> 1,2,3 -ne 4 1 2 3

Tämä saattaa näyttää fiksu temppu, mutta meillä on toimijoita -contains ja -in, joka hoitaa tämän tehokkaammin ja -notcontains oikein tehdä, mitä odotat.

-sisältää

-contains operaattori tarkistaa kokoelman arvoa., Heti kun se löytää ottelu, se palaa $true.

 $array = 1..6 if ( $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ävellä koko lista joka kerta ja olla huomattavasti hitaampaa.,

Muunnelmia:

  • -contains kirjainkoko ottelu
  • -icontains kirjainkoko ottelu
  • -ccontains kirjainkoko ottelu
  • -notcontains kirjainkoko ei hyväksytty
  • -inotcontains kirjainkoko ei hyväksytty
  • -cnotcontains kirjainkoko ei hyväksytty

-in

-in operaattori on aivan -contains operaattori paitsi kokoelma on oikealla puolella.,

 $array = 1..6 if ( 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ä on 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 vielä on kertaa käytät sitä.

!,

Voit käyttää ! kuin alias -not.

 if ( -not $value ){} if ( !$value ){}

näet ! 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 selvempi tässä esimerkissä, mutta ne ovat valinnaisia niin kauan kuin ekspresio on yksinkertainen. Tässä on sama esimerkki ilman niitä.

 if ( $age -gt 13 -and $age -lt 55 )

Arviointi tapahtuu vasemmalta oikealle. Jos ensimmäinen kohde arvioi $false, se poistuu aikaisin eikä tee oikeaa vertailua., Tämä on kätevä, kun sinun täytyy varmistaa, että arvo on olemassa ennen kuin käytät sitä. Test-Path esimerkiksi heittää virhe, 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 ilme.

huomaa myös, miten syntaksi toimii näille operaattoreille. Tarvitset kaksi erillistä ilmaisua. Olen 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 molemmat kohteet ovat $false tai molemmat kohteet ovat $true, niin koko ilme on $false. Toinen tapa tarkastella tätä on, että 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ä siitä, miksi koskaan käyttäisin sitä.

Bitwise operaattorit

Bitwise operaattorit suorittaa laskutoimituksia bittiä sisällä arvot ja tuottavat uuden arvon seurauksena., Bitwise-toimijoiden opettaminen ei kuulu tämän artikkelin soveltamisalaan, mutta tässä on luettelo niistä.

  • -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 palauttavat muita arvoja.

 if ( Get-Process Notepad* )

arvioi $true jos siellä on palannut prosessi ja $false jos siellä ei ole mitään., Se on täysin 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 voit joutua käyttämään suluissa rikkoa niitä osa-ilmaisuja.

 if ( (Get-Process) -and (Get-Service) )

Tarkistaminen $null

Ottaa ei tulos tai $null arvo arvo $false if lausunto., Kun tarkkailun erityisesti $null, se on paras käytäntö 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ä.,

yleensä kun muuttujalle annetaan arvo, arvoa ei siirretä putkelle tai konsolille. Kun teet muuttuvan tehtävän alailmaisulla, se siirtyy putkistoon.

 PS> $first = 1 PS> ($second = 2) 2

Katso, miten $first tehtävä ei ole tuotos ja $second tehtävä ei? Kun tehtävä on valmis if lausunto, se tulee suorittaa vain, kuten $second tehtävän edellä., Täällä on puhdas esimerkki siitä, miten voit käyttää sitä:

 if ( $process = Get-Process Notepad* ) { $process | Stop-Process }

– Jos $process saa määritetty arvo, niin ilmoitus tulee $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 epämääräisempi ominaisuus, jota useimmat ihmiset eivät tajua toimivan näin.,

Vaihtoehtoinen polkuun

if selvitys avulla voit määrittää toiminnon, ei vain silloin, kun selvitys on $true, mutta myös silloin, kun se on $false. Tällöin tulee esiin else lausuma.

muualla

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-komennon sisällä, 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 toisen tarkistuksen ja annamme käyttäjälle tarkempia tietoja.

elsef

emme rajoitu vain yhteen ehdolliseen tarkastukseen., Voimme ketju if ja else lausunnot yhteen sen sijaan, että pesintä niitä käyttämällä elseif lausunto.

toteutus tapahtuu ylhäältä alas. Ylin if lausuma arvioidaan ensin. Jos se on $false, niin se siirtyy seuraavalle elseif tai else luettelossa. Tuo viimeinen else on oletustoiminto, joka suoritetaan, jos mikään toisten paluu $true.,

switch

tis-pisteessä pitää mainita switch lausuma. Se tarjoaa vaihtoehtoisen syntaksin tehdä useita vertailuja arvo. Jossa switch, voit määrittää ilmaisun ja tuloksen saa verrattuna useita eri arvoja. Jos jokin näistä arvoista mach, niin vastaava koodilohko suoritetaan. 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ässä tapauksessa, se on ottelu, jossa Role ja is a role olisi toteutettu. Käytin hyvin 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 hyvin ainutlaatuinen ja tärkeä ominaisuus PowerShell. Kaikki arvo, jota ei tukahduteta tai osoiteta muuttujaan, sijoitetaan putkistoon., if tarjoaa meille tavan hyödyntää putkistoa 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 olemme määrittäminen tulos, jos ilmoitus $discount muuttuja. Että esimerkiksi olisi voinut yhtä helposti määritetty ne arvot $discount muuttuja suoraan kunkin scriptblock., En voi sanoa, että en käytä tätä if selvitys kovin usein, mutta minulla on esimerkki, jossa olen käyttänyt tätä viime aikoina.

Array inline

minulla on toiminto nimeltään Vedota-SnowSql, joka käynnistää suoritettavan useita commandline argumentteja. 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 nuo arvot putoavat $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 ja, jos ilmoitus rullaa pois oikealla puolella näytön.

ne voivat olla vaikealukuisia ja tehdä virheitä herkemmin. Voimme tehdä asialle muutamia asioita.,

Line jatkoa

On joitakin toimijoita PowerShell, että voit kääri sinut komentoa seuraavalle riville. Loogiset operaattorit -and ja -or ovat hyviä toimijat voivat käyttää, jos haluat rikkoa oman ilmaisun osaksi useita rivejä.

siellä tapahtuu vielä paljon, mutta jokaisen kappaleen sijoittamisella omalle rivilleen on iso merkitys. Teen tämän yleensä vain, kun saan yli kaksi vertailua tai jos minun täytyy vierittää oikeutta lukea ligiciä.,

Pre-laskemalla tulokset

– Emme voi ottaa sitä lausuntoa, jos lausunnon ja vain tarkistaa tuloksen.

Tämä vain tuntuu paljon puhtaammalta kuin edellinen esimerkki. Saat myös mahdollisuuden käyttää muuttuvaa nimeä, joka selittää, mitä se on, että olet todella tarkistaa. Tämä on myös ja esimerkki itse dokumentoiva koodi, joka säästää tarpeettomia kommentteja.

jos Useita lausuntoja

Emme voi rikkoa tätä ylös useita lausuntoja ja tarkistaa ne yksi kerrallaan. Tällöin yhdistämme tulokset lipulla tai seurantamuuttujalla.,

jouduin kääntämään logiikan, jotta lippulogiikka toimisi oikein. Jokainen arviointi on yksilöllinen if lausuma. Tämän etuna on, että virheenkorjauksen yhteydessä voi kertoa tarkalleen, 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 monimutkaisempi tarkastella, koska 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ää yhdellä silmäyksellä.

 if ( Test-SecureDriveConfiguration -ADUser $user ) { # do something }

vielä luoda toiminto tehdä validointi, mutta se tekee tämän koodin paljon helpompi työskennellä. Tämä koodi on helpompi testata. Teidän testejä, voit pilkata puhelun Test-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 on niin pieni.,

funktion runko voi silti olla se yksi liner, jolla aloitimme, tai räjähtävä logiikka, jota käytimme viimeisessä osiossa. Tämä toimii hyvin molemmissa skenaarioissa ja voit helposti muuttaa tätä täytäntöönpanoa myöhemmin.

Virheiden käsittely

Yksi todella tärkeä käyttö if lausunto on tarkistaa virheiden varalta, ennen kuin olet joutunut virheitä. 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 kaikesta, mitä olet koskaan halunnut tietää poikkeuksista.

viimeiset sanat

if lausunto on tällainen yksinkertainen toteamus, mutta se on hyvin olennainen pala PowerShell. Huomaat käyttäväsi tätä useita kertoja lähes jokaisessa kirjoituksessasi., Toivottavasti ymmärrätte paremmin kuin ennen.

Share

Vastaa

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