Alt du ønsket å vite om hvis uttalelse

  • 05/23/2020
  • 18 minutter på å lese
    • j
    • x
    • t
    • D
    • s

Som mange andre språk, PowerShell har uttalelser for betinget kjøre kode i yourscripts. En av disse uttalelsene er en If-setning., I dag vil vi ta et dypdykk inn i en ofthe mest grunnleggende kommandoer i PowerShell.

Merk

Den opprinnelige versjonen av denne artikkelen dukket opp på bloggen skrevet av @KevinMarquette. ThePowerShell team takk Kevin for å dele denne innhold med oss. Sjekk ut bloggen hans atPowerShellExplained.com.

Betinget utførelse

skript ofte behov for å ta beslutninger og utføre forskjellige logikk basert på de beslutninger.Dette er hva jeg mener med betinget utførelse., Du har en uttalelse eller verdi som skal beregnes, thenexecute en annen del av koden er basert på at evaluering. Dette er akkurat hva iferklæringen.

en if-setning

Her er et enkelt eksempel på if uttalelse:

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

første if statement gjør er å evaluere uttrykk i parentes. Hvis det evaluatesto $true, da den utfører scriptblock i bukseseler., Hvis verdien er $false, deretter itwould hopp over at scriptblock.

I forrige eksempel, if uttalelsen var bare å evaluere $condition variabel. Det var$true og ville ha utført Write-Output – kommandoen inne i scriptblock.

I noen språk, og du kan plassere en enkelt linje med kode etter if uttalelse, og det getsexecuted. Det er ikke tilfelle i PowerShell. Du må oppgi en full scriptblock med tannregulering forit for å fungere riktig.,

Sammenligningen operatører

Den mest vanlige bruken av if statement for er å sammenligne to elementer med hverandre. PowerShell hasspecial operatører for ulike sammenligningen scenarier. Når du bruker en sammenligning operatøren, valueon venstre side er i forhold til verdien på høyre side.

-eq for likestilling

-eq gjør en likestilling sjekk mellom to verdier for å sørge for at de er lik hverandre.,

$value = Get-MysteryValueif ( 5 -eq $value ){ # do something}

I dette eksempelet, jeg tar en kjent verdi av 5 og sammenligne det til min $value for å se om theymatch.

En mulig bruk tilfellet er å sjekke statusen til en verdi før du tar en handling på det. Du couldget en tjeneste, og kontroller at status var i gang før du har ringt Restart-Service på det.

Det er vanlig i andre språk som C# for å bruke == for likestilling (eks: 5 == $value) men det betyr’twork med PowerShell., En annen vanlig feil som folk gjør er å bruke likhetstegnet (eks:5 = $value) som er reservert for tilordning av verdier til variabler. Ved å plassere kjent verdi på theleft, det gjør at feil mer vanskelig å gjøre.

Denne operatøren (og andre) har et par varianter.,

  • -eq bokstaver likestilling
  • -ieq bokstaver likestilling
  • -ceq mellom store og små bokstaver likestilling

-ne ikke lik

Mange operatører har en relatert operatør som er å se etter det motsatte resultat. -ne sikrer thatthe verdiene ikke er lik hverandre.

if ( 5 -ne $value ){ # do something}

Bruk dette for å sørge for at handlingen bare utføres hvis verdien ikke er 5., En god bruk-tilfeller wherewould være å sjekke om en tjeneste som var i den løpende tilstand før du prøver å starte det.

Varianter:

  • -ne bokstaver ikke lik
  • -ine bokstaver ikke lik
  • -cne mellom store og små bokstaver ikke lik

Dette er invers varianter av -eq. Jeg vil gruppere disse typer sammen når jeg liste variationsfor andre operatører.,

-gt -ge -lt -le for større enn eller mindre enn

Disse operatorene brukes ved kontroll for å se om en verdi er større eller mindre enn en annen verdi.-gt -ge -lt -le står for GreaterThan, GreaterThanOrEqual, LessThan, og LessThanOrEqual.,eater enn eller lik, små bokstaver

  • -cge større enn eller lik, mellom store og små bokstaver
  • -lt mindre enn
  • -ilt mindre enn, små bokstaver
  • -clt mindre enn, mellom store og små bokstaver
  • -le mindre enn eller lik
  • -ile mindre enn eller lik, små bokstaver
  • -cle mindre enn eller lik, mellom store og små bokstaver
  • jeg vet ikke hvorfor du vil bruke små og store bokstaver og små bokstaver valg for disse operatorene.,

    -som søk med jokertegn

    PowerShell har sin egen jokertegn-basert pattern matching-syntaks og du kan bruke den med -likeoperatør. Disse jokertegn mønstre er ganske grunnleggende.

    • ? samsvarer med et hvilket som helst enkelttegn
    • * samsvarer med et hvilket som helst antall tegn
    $value = 'S-ATX-SQL01'if ( $value -like 'S-*-SQL??'){ # do something}

    Det er viktig å peke på at mønsteret stemmer strengen. Hvis du trenger å matchsomething i midten av strengen, må du plassere * på begge ender av thestring.,e»>

    Varianter:

    • -like bokstaver jokertegnet
    • -ilike bokstaver jokertegnet
    • -clike mellom store og små bokstaver jokertegnet
    • -notlike bokstaver jokertegn ikke matchet
    • -inotlike bokstaver jokertegn ikke matchet
    • -cnotlike mellom store og små bokstaver jokertegn ikke matchet

    -kamp på regulære uttrykk

    -match operatør lar deg kontrollere en streng til et regulært-uttrykk-basert kamp., Bruk thiswhen jokertegnet mønstre er ikke fleksible nok for deg.

    $value = 'S-ATX-SQL01'if ( $value -match 'S-\w\w\w-SQL\d\d'){ # do something}

    En regex mønster kamper hvor som helst i string som standard. Slik kan du angi en delstreng thatyou vil matchet som dette:

    $value = 'S-ATX-SQL01'if ( $value -match 'SQL'){ # do something}

    Regex er en kompleks eget språk og verdt å se nærmere på. Jeg snakker mer om -match andthe mange måter å bruke regex i en annen artikkel.,

    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}

    Du kan bruke dette hvis du arbeider med undervisning eller aksepterer ulike objekter over rørledningen. Youcould har enten en tjeneste eller en tjeneste navn som input. Så sjekk for å se hvis du har en serviceand hente tjenesten hvis du bare har navnet.,

    if ( $Service -isnot ){ $Service = Get-Service -Name $Service}

    Variasjoner:

    • -is type
    • -isnot ikke av typen

    Samling operatører

    Når du bruker den forrige operatører med en enkelt verdi, resultatet er $true eller $false. Dette ishandled litt annerledes når du arbeider med en samling. Hvert element i samlingen getsevaluated og operatøren returnerer hver verdi som evaluerer til $true.,

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

    Dette fortsatt fungerer riktig i en if uttalelse. Så en verdi som er returnert av operatør, så thewhole uttalelse er $true.

    $array = 1..6if ( $array -gt 3 ){ # do something}

    Det er en liten felle gjemmer seg i detaljer her som jeg trenger til å peke ut. Når du bruker -neoperatør denne måten, er det lett å feilaktig se på logikken bakover. Ved hjelp av -ne med acollection returnerer $true hvis noen element i samlingen ikke samsvarer med din verdi.,

    PS> 1,2,3 -ne 4123

    Dette kan se ut som et smart triks, men vi har operatører -contains og -in som håndterer dette moreefficiently. Og -notcontains gjør hva du forventer.

    -inneholder

    -contains operatøren kontrollerer samling for din verdi. Så snart det finner en match, itreturns $true.

    $array = 1..6if ( $array -contains 3 ){ # do something}

    Dette er den foretrukne måten å se om en samling inneholder verdien., Ved hjelp av Where-Object (eller-eq) går hele listen hver gang, og er betydelig tregere.,

    Varianter:

    • -contains bokstaver match
    • -icontains bokstaver match
    • -ccontains mellom store og små bokstaver match
    • -notcontains bokstaver ikke matchet
    • -inotcontains bokstaver ikke matchet
    • -cnotcontains mellom store og små bokstaver ikke matchet

    -i

    -in operatør er akkurat som -contains operatør bortsett fra samlingen ligger på høyre handside.,

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

    ikke

    -not operatør knipser et uttrykk fra $false til $true eller $true til $false. Hereis et eksempel der vi ønsker å utføre en handling når Test-Path er $false.

    if ( -not ( Test-Path -Path $path ) )

    de Fleste av operatørene vi snakket om har en variant der du ikke trenger å bruke -notoperatør. Men det er fortsatt ganger er det nyttig.

    !, operatør

    Du kan bruke ! som et alias for -not.

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

    Du kan se ! brukt mer av folk som kommer fra et annet språk som C#. Jeg foretrekker å skrive itout fordi jeg synes det er vanskelig å se når du ser raskt på min skript.

    -og

    Du kan kombinere uttrykk med -and operatør. Når du gjør at begge sider må være$true for hele uttrykk for å være $true.,

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

    I dette eksempelet, $age må være 13 år eller eldre for venstre side og mindre enn 55 for høyre side. Iadded ekstra parentes for å gjøre det klarere i dette eksempelet, men de er valgfritt så lenge theexpression er enkel. Her er det samme eksemplet uten dem.

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

    Evaluering skjer fra venstre mot høyre. Hvis det første elementet beregner $false, det kommer ut tidlig anddoesn ikke utføre riktig sammenligning. Dette er hendig når du trenger å sørge for at en verdi eksisterer beforeyou bruke det., For eksempel, Test-Path kaster en feilmelding hvis du gir det en $null banen.

    if ( $null -ne $path -and (Test-Path -Path $path) )

    -eller

    -or lar deg angi to uttrykk og returnerer $true hvis ett av dem er$true.

    if ( $age -le 13 -or $age -ge 55 )

    Akkurat som med -and operatør, evaluering skjer fra venstre mot høyre., Bortsett fra at hvis thefirst del er $true, deretter hele uttalelsen er $true og det er ikke prosessen resten av theexpression.

    Også gjøre oppmerksom på hvordan syntaksen fungerer for disse operatorene. Du trenger to separate uttrykk. Ihave sett-brukere forsøker å gjøre noe som dette $value -eq 5 -or 6 uten å innse sine feil.

    -xor eksklusiv eller

    Dette er litt uvanlig. -xor tillater bare ett uttrykk for å evaluere til $true., Så hvis bothitems er $false eller begge elementer er $true, og hele uttrykket $false. En annen måte tolook på dette er uttrykk er bare $true når resultatene av uttrykk er forskjellige.

    Det er sjelden at noen noen gang ville bruke denne logiske operatoren og jeg kan ikke tenke seg et godt eksempel som towhy jeg noensinne ville bruke det.

    Bitvis operatører

    Bitvis operatører utføre beregninger på biter i verdier og produsere en ny verdi som theresult., Undervisning bitvis operatører er utenfor omfanget av denne artikkelen, men her er listen thethem.

    • -band binære OG
    • -bor binære ELLER
    • -bxor binære eksklusiv ELLER
    • -bnot binære IKKE
    • -shl shift venstre
    • -shr shift høyre

    PowerShell-uttrykk

    Vi kan bruke vanlig PowerShell inne tilstanden uttalelse.,

    if ( Test-Path -Path $Path )

    Test-Path tilbake $true eller $false når den utføres. Dette gjelder også kommandoer som returnother verdier.

    if ( Get-Process Notepad* )

    Den evaluerer til $true hvis det ikke er returnert prosessen og $false hvis det’sn’thing., Det’sperfectly gyldig å bruke rørledning uttrykk eller andre PowerShell uttalelser som dette:

    if ( Get-Process | Where Name -eq Notepad )

    Disse uttrykkene kan kombineres med hverandre med -and og -or operatører, men du mayhave å bruke parenteser for å bryte dem i subexpressions.

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

    se etter $null

    å Ha en noe resultat eller en $null verdi beregner $false i if uttalelse., Når checkingspecifically for $null, det er en beste praksis for å plassere $null på venstre side.

    if ( $null -eq $value )

    Det er ganske mange nyanser når du arbeider med $null verdier i PowerShell. Hvis du er interestedin dykking dypere, jeg har en artikkel om alt du ønsket å vite om $null.

    Variabel tildeling

    jeg nesten glemte å legge dette til Prasoon Karunan V minnet meg om det.,

    if ($process=Get-Process notepad -ErrorAction ignore) {$process} else {$false}

    Vanligvis når du tilordner en verdi til en variabel, verdien er ikke gått på rørledningen orconsole. Når du gjør en variabel oppdrag på en sub uttrykk, er det ikke bli gitt videre til thepipeline.

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

    Se hvordan $first oppdrag har ingen effekt og $second tildeling gjør? Når en assignmentis gjort i en if statement, utføres akkurat som $second oppdrag over., Her er en cleanexample på hvordan du kan bruke det:

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

    Hvis $process får tildelt en verdi, da uttalelsen er $true og $process blir stoppet.

    sørg for at du ikke forveksle dette med -eq fordi dette ikke er en likestilling sjekk. Dette er en moreobscure funksjon som de fleste folk ikke innser fungerer på denne måten.,

    Alternativ gjennomføring sti

    if uttalelse lar deg angi en handling for ikke bare når uttrykket er $true, butalso for når det er $false. Dette er hvor else uttalelsen kommer inn i bildet.

    annet

    else uttalelse er alltid den siste delen av if uttalelse når den brukes.

    I dette eksemplet, vi sjekker $path for å være sikker på at det er en fil. Hvis vi finner filen, flytter vi det. Ifnot, vi skrive en advarsel., Denne type forgrening logikk er svært vanlig.

    Nestede hvis

    if og else uttalelser ta et skript blokk, slik at vi kan plassere noen PowerShell kommando insidethem, blant annet if uttalelse. Dette gir deg mulighet til å gjøre bruk av mye mer komplisert logikk.

    I dette eksempelet, tester vi glade banen først, og deretter ta handling på det. Hvis det mislykkes, vil vi doanother sjekk og for å gi mer detaljert informasjon til brukeren.

    elseif

    Vi ikke er begrenset til bare en enkelt betinget sjekk., Vi kan kjede if og else statementstogether i stedet for hekkende dem ved å bruke elseif uttalelse.

    utførelsen skjer fra toppen til bunnen. Toppen if uttalelsen er behandlet først. Hvis thatis $false, så det går nedover til neste elseif eller else i listen. Det siste else er thedefault tiltak for å ta hvis ingen av de andre retur $true.,

    bytt

    På dette punktet, jeg trenger å nevne switch uttalelse. Det gir en alternativ syntaks for doingmultiple sammenligninger med en verdi. Med switch du angi et uttrykk, og at resultatet getscompared med flere forskjellige verdier. Hvis en av disse verdiene samsvarer, samsvarende kode blokk isexecuted. Ta en titt på dette eksempelet:

    $itemType = 'Role'switch ( $itemType ){ 'Component' { 'is a component' } 'Role' { 'is a role' } 'Location' { 'is a location' }}

    Det tre mulige verdier som kan matche $itemType. I dette tilfellet, det samsvarer med Role., Iused et enkelt eksempel bare for å gi deg noen eksponering til switch operatør. Jeg snakker moreabout alt du noensinne ønsket å vite om bytte uttalelse i en annen artikkel.

    Rørledning

    rørledningen er en unik og viktig funksjon i PowerShell. Alle verdier som ikke er suppressedor tilordnet en variabel blir plassert i rørledningen. if gir oss en måte å ta advantageof rørledningen på en måte som ikke alltid er åpenbare.,

    $discount = if ( $age -ge 55 ){ Get-SeniorDiscount}elseif ( $age -le 13 ){ Get-ChildDiscount}else{ 0.00}

    Hvert skript blokk er å plassere resultatene kommandoer eller verdien inn i rørledningen. Da vi assignthe resultat av if uttalelse til $discount variabel. Som eksempel kan ha like easilyassigned disse verdiene til $discount variabel direkte i hver scriptblock. Jeg kan ikke si at Iuse dette med if uttalelse ofte, men jeg har et eksempel der jeg brukte dette nylig.,

    Array inline

    jeg har en funksjon som kalles Påberope-SnowSql som starter en kjørbar med flere kommando-linearguments. Her er et klipp fra den funksjonen der jeg bygge rekken av argumenter.

    $Debug og $Path variabler er parametrene i funksjonen som er gitt av sluttbrukeren.Jeg vurderer dem inline inne i oppstarten av mitt utvalg. Hvis $Debug er sann, så er de valuesfall i $snowSqlParam på riktig sted. Det samme gjelder for de $Path variabel.,

    Forenkle komplekse operasjoner

    Det er uunngåelig at du kjører inn i en situasjon som har altfor mange sammenligninger for å sjekke og dineIf uttalelse ruller vei ut av høyre side av skjermen.

    De kan være vanskelig å lese og som gjør deg mer utsatt for å gjøre feil. Det er et par ting wecan gjøre med det.

    Line videreføring

    Det enkelte operatører i PowerShell som lar deg pakke du kommandoen til neste linje., Den logicaloperators -and og -or er gode operatører å bruke hvis du ønsker å bryte uttrykket intomultiple linjer.

    Det er fortsatt mye å gå på der, men å plassere hver brikke på sin egen linje gjør en stor forskjell.Jeg bruker vanligvis denne når jeg får mer enn to sammenligninger eller hvis jeg har å bla til høyre toread noen av logikk.

    Pre-beregning av resultater

    Vi kan ta denne uttalelsen ut av if uttalelse og bare sjekke resultatet.

    Dette føles mye renere enn det forrige eksemplet., Du også får en mulighet til å bruke avariable navn som forklarer hva det er som du virkelig sjekke. Dette er også eksempel og ofself-dokumentere koden som sparer unødvendige kommentarer.

    hvis Flere uttalelser

    Vi kan bryte dette opp i flere uttalelser og sjekk dem en om gangen. I dette tilfellet bruker vi aflag eller en sporing variabel for å kombinere resultater.

    jeg har nødt til å snu logikken for å gjøre flagg logikk fungerer på riktig måte. Hver vurdering er anindividual ‘ if uttalelse., Fordelen med dette er at når du er feilsøking, kan du tellexactly hva logikk er å gjøre. Jeg var i stand til å legge mye bedre detaljnivå på samme tid.

    Den åpenbare ulempen er at det er så mye mer kode for å skrive. Koden er mer komplekse å se atas det tar en enkelt linje med logikk og eksploderer det i 25 eller flere linjer.

    ved Hjelp av funksjoner

    Vi kan også flytte alle at validering logikk inn i en funksjon. Se på hvor rent det ser ut på aglance.,

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

    Du har fortsatt å opprette funksjonen til å gjøre validering, men det gjør denne koden mye lettere towork med. Det gjør denne koden enklere å teste. I testene dine, kan du mock samtalen tilTest-ADDriveConfiguration og du trenger bare to tester for denne funksjonen. Der går den tilbake$true og der går den tilbake $false. Testing av andre funksjonen er enklere fordi det’sso små.

    kroppen av denne funksjonen kan likevel være at one-liner er vi i gang med eller eksploderte logikk thatwe brukt i den siste delen., Dette fungerer godt for begge scenarier og lar deg enkelt endre thatimplementation senere.

    Feil håndtering

    En viktig bruk av if erklæringen er å sjekke for feil betingelser før du kjører intoerrors. Et godt eksempel er å sjekke om en mappe som allerede finnes før du prøver å opprette det.

    if ( -not (Test-Path -Path $folder) ){ New-Item -Type Directory -Path $folder}

    jeg liker å si at hvis du forventer et unntak å skje, så det er egentlig ikke et unntak. Så checkyour verdier og validere din forholdene der du kan.,

    Hvis du ønsker å dykke litt mer inn i selve unntak håndtering, jeg har en artikkel oneverything du noensinne ønsket å vite om unntak.

    Siste ord

    if uttalelse er slik en enkel uttalelse, men er en grunnleggende del av PowerShell. Du willfind selv ved hjelp av dette flere ganger i nesten alle skript du skriver. Jeg håper du har en betterunderstanding enn du hadde før.

    Legg igjen en kommentar

    Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *