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
- -eq for likestilling
- 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ørerscriptblock
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ørtWrite-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 komplettscriptblock
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 - !,pressions
-
-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 – > - ikke
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.