Powershell: Alt du ønsket å vite om HVIS uttalelse

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

  • Indeks
  • Betinget gjennomføring
  • hvis uttalelse
  • Sammenligningen operatører
    • -eq for likestilling
      • -ne ikke lik
    • -gt -ge -lt -le for større enn eller mindre enn
    • -som søk med jokertegn
    • -kamp på regulære uttrykk
    • -er av typen
  • Samling operatører
    • -inneholder
    • i
  • Logiske operatorene
    • ikke
      • !,pressions
        • Kontrollere for $null
        • Variabel tildeling
      • Alternativ gjennomføring bane
        • andre
        • Nestede hvis
        • elseif
        • bytt
      • Rørledning
        • Array inline
      • Forenkle komplekse operasjoner
        • Line videreføring
        • Pre-beregning av resultater
        • hvis Flere uttalelser
        • ved Hjelp av funksjoner
      • håndtering av Feil
      • Siste ord

      Betinget utførelse

      Skriptene vil ofte ha 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, og deretter utføre ulike deler av koden er basert på at evaluering. Dette er akkurat hva if erklæringen.

      en if-setning

      Her er et veldig enkelt eksempel på if uttalelse:

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

      første if statement gjør er å evaluere uttrykk i parentes., Hvis det vurderes å $true, så vil det utfører scriptblock i bukseseler. Hvis verdien er $false, så det ville hoppe 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 vil bli utført., Det er ikke tilfelle i PowerShell. Du trenger å gi en komplett scriptblock med bukseseler for at det skal fungere riktig.

      Sammenligningen operatører

      Den vanligste tingen du vil bruke if statement for er å sammenligne to elementer med hverandre. Powershell har spesielle operatorer for ulike sammenligningen scenarier. Når du bruker en sammenligning operatør, verdien på venstre side er i forhold til verdien på høyre side.,

      -eq for likestilling

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

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

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

      En mulig usecase er å sjekke statusen til en verdi før du tar en handling på det. Du kan få 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 som ikke jobber 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 kjente verdien på venstre side, det gjør at feil mer vanskelig å gjøre.

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

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

      -ne ikke lik

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

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

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

      Varianter:

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

      Dette er bare inverse varianter av -eq. Jeg vil gruppere disse typer sammen når jeg liste variasjoner for 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, mellom store og små bokstaver

    • -cge større enn eller lik, mellom store og små bokstaver
    • -lt mindre enn
    • -ilt mindre enn, mellom store og små bokstaver
    • -clt mindre enn, mellom store og små bokstaver
    • -le mindre enn eller lik
    • -ile mindre enn eller lik, mellom store og små bokstaver
    • -cle mindre enn eller lik, mellom store og små bokstaver

    jeg vet ikke hvorfor du skulle bruke 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 -like operatør. Disse jokertegn mønstre er ganske grunnleggende.

    • ? vil matche et hvilket som helst enkelttegn
    • * vil matche en hvilken 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 å være noe i midten av strengen så du er nødt til å plassere * på begge ender av tråden.,iv – >

Varianter:

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

-kamp på regulære uttrykk

-match operatør lar deg kontrollere en streng som for et vanlig uttrykk basert kamp., Bruk dette når jokertegn mønsteret er ikke fleksibelt nok for deg.

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

En regex mønster vil matche hvor som helst i string som standard. Slik kan du angi en delstreng at du 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 og 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 are able to 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. Du kan enten ha en tjeneste eller en tjeneste navn som input. Så sjekk for å se hvis du har en tjeneste og hente tjenesten hvis du bare har navnet.,

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

Varianter:

  • -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 er håndtert på en litt annerledes når du arbeider med en samling. Hvert element i samlingen blir evaluert og operatøren vil i stedet komme tilbake hver verdi som evaluerer til $true.,

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

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

 $array = 1..6 if ( $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 -ne operatør denne måten, er det lett å feilaktig se på logikken bakover., Ved hjelp av -ne med en samling vil gå tilbake $true hvis noen element i samlingen ikke samsvarer med din verdi.

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

Dette kan se ut som et smart triks, men vi har operatører -contains og -in som håndterer dette på en mer effektiv måte og -notcontains vil riktig gjør hva du forventer.

-inneholder

-contains operatør vil du sjekke samling for din verdi., Så snart som det finner en match, vil den gå tilbake $true.

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

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

Varianter:

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

-i

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

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

ikke

-not operatør knipser et uttrykk fra $false til $true eller $true til $false. Her er et eksempel hvor 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 hvor ville du ikke trenger å bruke -not operatør, men det er fortsatt ganger du vil bruke den.

!,

Du kan bruke ! som et alias for -not.

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

vil Du se ! brukt mer av folk som kommer fra et annet språk som C#. Jeg foretrekker å skrive den ut 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. Jeg har lagt ekstra parentes for å gjøre det mer tydelig i dette eksempelet, men de er valgfritt så lenge expresion 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 da det vil gå ut tidlig og ikke utføre riktig sammenligning., Dette er hendig når du trenger å sørge for at en verdi finnes før du bruker det. Test-Path for eksempel vil kaste en feil 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 den første delen er $true, deretter hele uttalelsen er $true og det vil ikke behandle resten av uttrykket.

Også gjøre oppmerksom på hvordan syntaksen fungerer for disse operatorene. Du trenger to separate uttrykk. Jeg har 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 begge elementer er $false eller begge elementer er $true, og hele uttrykket $false. En annen måte å se 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 på hvorfor jeg noensinne ville bruke det.

Bitvis operatører

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

  • -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 returnerer andre verdier.

 if ( Get-Process Notepad* )

Det vil vurdere å $true hvis det er en hjemvendt prosessen og $false hvis det er noe., Det er helt 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 kan ha til å bruke parenteser for å bryte dem i sub-uttrykk.

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

sjekk for $null

å Ha en noe resultat eller en $null verdi beregner $false i if uttalelse., Når du sjekker spesielt 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 interessert i 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.,

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

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

Se hvordan $first oppdrag har ingen effekt og $second tildeling gjør? Når et oppdrag er utført i en if uttalelse, vil det utføre akkurat som $second oppdrag over., Her er et enkelt eksempel på hvordan du kan bruke det:

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

Hvis $process får tildelt en verdi, da uttalelsen vil bli $true og deretter $process vil bli stoppet.

sørg for at du ikke forveksle dette med -eq fordi dette er ikke en likestillings-sjekk. Dette er en mer obskure 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, men også 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. Hvis ikke, kan 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 inne i dem, 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 gjøre en annen sjekk og for å gi mer detaljert informasjon til brukeren.

elseif

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

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

bytt

På tis punktet, jeg trenger å nevne switch uttalelse. Det gir en alternativ syntaks for å gjøre flere sammenligninger med en verdi. Med switch du angi et uttrykk og som resultat blir sammenlignet med flere forskjellige verdier. Hvis en av disse verdiene mach, så de samsvarende kode blokk blir utført. 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 vil passe med Role og is a role ville bli henrettet. Jeg brukte et veldig enkelt eksempel bare for å gi deg noen eksponering til switch operatør. Jeg snakker mer om alt du noensinne ønsket å vite om bytte uttalelse i en annen artikkel.

Rørledning

rørledningen er en veldig unik og viktig funksjon i PowerShell. Alle verdier som ikke er undertrykt eller er tilordnet en variabel blir plassert i rørledningen., if gir oss en måte å dra nytte av 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 er vi tilordne et resultat av en if-setning til $discount variabel. Som eksempel kan ha like enkelt tildelt disse verdiene til $discount variabel direkte i hver scriptblock., Jeg kan ikke si at jeg bruker denne med if uttalelse veldig ofte, men jeg har et eksempel hvor jeg har brukt dette nylig.

Array inline

jeg har en funksjon som kalles Påberope-SnowSql som starter en kjørbar med flere commandline argumenter. 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 disse verdiene som faller inn $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 om 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 vi kan gjøre med det.,

Line videreføring

Det enkelte operatører i PowerShell som lar deg pakke du kommandoen til neste linje. De logiske operatorene -and og -or er gode operatører å bruke hvis du ønsker å bryte uttrykk i flere linjer.

Det er fortsatt mye å gå på der, men å plassere hver brikke på sin egen linje gjør en stor forskjell. Jeg generelt bare gjøre dette når jeg får mer enn to sammenligninger eller hvis jeg har å bla til høyre for å lese noen av de ligic.,

Pre-beregning av resultater

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

Dette føles mye renere enn det forrige eksemplet. Du også får en mulighet til å bruke en variabel navn som forklarer hva det er som du virkelig sjekke. Dette er også eksempel på at selv 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 vil vi bruke et flagg 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 en individuell if uttalelse. Fordelen med dette er at når du er feilsøking, kan du fortelle nøyaktig hva det er logisk å 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 på som 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å et øyeblikk.

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

Du har fortsatt å opprette funksjonen til å gjøre validering, men det gjør denne koden mye enklere å jobbe med. Det gjør denne koden enklere å teste. I testene dine, kan du mock samtalen til Test-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 funksjoner vil være enklere fordi det er så liten.,

kroppen av denne funksjonen kan likevel være at one-liner er vi i gang med eller eksploderte logikk som vi brukte i den siste delen. Dette fungerer godt for begge scenarier og lar deg enkelt endre dette senere gjennomføring.

Feil håndtering

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

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

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

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

Siste ord

if uttalelse er slik en enkel uttalelse, men er en svært grunnleggende del av PowerShell. Du vil finne deg selv å bruke denne flere ganger i nesten alle skript du skriver., Jeg håper du du har en bedre forståelse enn du hadde før.

Share

Legg igjen en kommentar

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