- 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 if
erklæ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å bokstaverjeg 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 -like
operatø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 -ne
operatø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 -not
operatø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.