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ä
- -eq tasa-arvo
- 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 suorittaascriptblock
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 toteutettuWrite-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äysiscriptblock
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 - !,pressions
-
-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> - ei
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.