net als vele andere talen heeft PowerShell statements voor het voorwaardelijk uitvoeren van code in uw scripts. Een van die verklaringen is de if-verklaring. Vandaag zullen we een diepe duik nemen in een van de meest fundamentele commando ‘ s in PowerShell.,
- Index
- Voorwaardelijke uitvoering
- De instructie
- Vergelijking operators
- -eq voor gelijkheid
- -ne niet gelijk aan
- -gt -ge -lt -le voor meer dan of minder dan
- -als wildcard overeenkomt met
- -overeen met reguliere expressie
- -type
- -eq voor gelijkheid
- Verzameling operatoren
- bevat
- in
- Logische operatoren
- niet
- !,pressions
- het Controleren voor $null
- Variabele toewijzing
- Alternatieve uitvoering pad
- anders
- Geneste if –
- elseif
- knop
- Pijplijn
- Array inline
- Vereenvoudigen van complexe operaties
- Lijn voortzetting
- Pre-berekening van de resultaten
- Meerdere if statements
- functies
- Fout afhandeling
- Laatste woorden
Voorwaardelijke uitvoering
Uw scripts zullen moeten vaak beslissingen nemen en uitvoeren van verschillende logica op basis van die besluiten., Dit is wat ik bedoel met voorwaardelijke uitvoering. Je hebt één statement of waarde te evalueren, voer dan een verschillende secties code uit op basis van die evaluatie. Dit is precies wat het
if
statement doet.het if statement
Hier is een zeer basaal voorbeeld van de
if
statement:$condition = $true if ( $condition ) { Write-Output "The condition was true" }
het eerste wat de
if
statement doet is de expressie evalueren in haakjes., Als het evalueert naar$true
, dan zal hetscriptblock
in de accolades uitvoeren. Als de waarde$false
was, dan zou het dat scriptblok overslaan.in het vorige voorbeeld was de verklaring
if
slechts een evaluatie van de variabele$condition
. Het was$true
en zou hetWrite-Output
commando in het scriptblok hebben uitgevoerd.in sommige talen kunt u een enkele regel code plaatsen na het
if
statement en het zal worden uitgevoerd., Dat is in PowerShell niet het geval. U moet een volledigescriptblock
voorzien van accolades om het correct te laten werken.Vergelijkingsoperators
het meest voorkomende ding dat u het
if
commando voor gebruikt is het vergelijken van twee items met elkaar. Powershell heeft speciale operators voor verschillende vergelijkingsscenario ‘ s. Wanneer u een vergelijkingsoperator gebruikt, wordt de waarde aan de linkerkant vergeleken met de waarde aan de rechterkant.,-eq voor gelijkheid
de
-eq
controleert of twee waarden gelijk zijn aan elkaar.$value = Get-MysteryValue if ( 5 -eq $value ) { # do something }
in dit voorbeeld neem ik een bekende waarde van
5
en vergelijk deze met mijn$value
om te zien of ze overeenkomen.een mogelijk gebruik is om de status van een waarde te controleren voordat u er een actie op onderneemt. U kunt een service krijgen en controleren of de status actief was voordat u
Restart-Service
op aanriep.,het is gebruikelijk in andere talen zoals C# om
==
te gebruiken voor gelijkheid (bijvoorbeeld:5 == $value
) maar dat werkt niet met powershell. Een andere veel voorkomende fout die mensen maken is het gebruik van het gelijkteken (bijvoorbeeld:5 = $value
) dat gereserveerd is voor het toewijzen van waarden aan variabelen. Door het plaatsen van uw bekende waarde aan de linkerkant, het maakt die fout meer ongemakkelijk te maken.deze operator (en anderen) heeft een paar variaties.,
-
-eq
hoofdletterongevoelige gelijkheid -
-ieq
hoofdletterongevoelige gelijkheid -
-ceq
hoofdlettergevoelige gelijkheid
-ne niet gelijk
veel operators hebben een verwante operator dat is controleren op het tegenovergestelde resultaat.
-ne
controleert of de waarden niet gelijk zijn aan elkaar.if ( 5 -ne $value ) { # do something }
Gebruik dit om ervoor te zorgen dat de actie alleen wordt uitgevoerd als de waarde niet
5
is., Een goed gebruik-gevallen waar zou zijn om te controleren of een dienst in de draaiende staat was voordat u probeert en start het.variaties:
-
-ne
ongevoelig voor hoofdletters niet gelijk -
-ine
ongevoelig voor hoofdletters niet gelijk -
-cne
gevoelig voor hoofdletters niet gelijk
div id=”a3815272be”>
. Ik groepeer deze types als ik variaties voor andere operators opsomm.,
– gt-ge-lt-le voor groter of kleiner dan
deze operators worden gebruikt bij het controleren of een waarde groter of kleiner is dan een andere waarde. De
-gt -ge -lt -le
staat voor groter dan, groter Danorequal, minder dan, en minder Danorequal.,eter dan of gelijk aan, niet hoofdlettergevoelig-cge
groter dan of gelijk is hoofdlettergevoelig-lt
minder dan-ilt
minder dan, niet hoofdlettergevoelig-clt
minder dan, hoofdletter gevoelig-le
kleiner dan of gelijk aan-ile
kleiner dan of gelijk aan, niet hoofdlettergevoelig-cle
kleiner dan of gelijk aan, hoofdletter gevoeligik weet niet waarom je zou gebruiken geval gevoelig en ongevoelig opties voor deze operatoren.,
-achtige jokertekens
PowerShell heeft zijn eigen jokertekens gebaseerde pattern matching syntaxis en u kunt het gebruiken met de
-like
operator. Deze wildcard patronen zijn vrij basic.-
?
komt overeen met elk enkel teken -
*
komt overeen met elk aantal tekens
$value = 'S-ATX-SQL01' if ( $value -like 'S-*-SQL??') { # do something }
Het is belangrijk erop te wijzen dat het patroon komt overeen met de hele snaar., Als je iets in het midden van de tekenreeks wilt matchen, dan moet je de
*
aan beide uiteinden van de tekenreeks plaatsen.,iv>Variaties:
-
-like
hoofdlettergevoelig wildcard -
-ilike
hoofdlettergevoelig wildcard -
-clike
hoofdlettergevoelig wildcard -
-notlike
hoofdlettergevoelig wildcard niet overeenkomt -
-inotlike
hoofdlettergevoelig wildcard niet overeenkomt -
-cnotlike
hoofdlettergevoelig wildcard niet overeenkomt
-overeen met reguliere expressie
De
-match
operator kunt u controleren of een string voor een reguliere expressie gebaseerd wedstrijd., Gebruik dit wanneer de jokertekens niet flexibel genoeg zijn voor u.$value = 'S-ATX-SQL01' if ( $value -match 'S-\w\w\w-SQL\d\d') { # do something }
een regexpatroon komt standaard overal in de tekenreeks overeen. U kunt dus een substring opgeven die u als volgt wilt matchen:
$value = 'S-ATX-SQL01' if ( $value -match 'SQL') { # do something }
Regex is een complexe taal op zich en het is de moeite waard om naar te kijken. Ik praat meer over
-match
en de vele manieren om regex in een ander artikel te gebruiken.,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 }
u kunt dit gebruiken als u met klassen werkt of verschillende objecten via de pijplijn accepteert. U kunt een service of een service naam als uw input. Controleer dan of je een service hebt en haal de service op als je alleen de naam hebt.,
if ( $Service -isnot ) { $Service = Get-Service -Name $Service }
Variaties:
-
-is
type -
-isnot
niet van het type
Verzameling operatoren
Wanneer u de vorige exploitanten met een enkele waarde, het resultaat is
$true
of$false
. Dit wordt iets anders behandeld bij het werken met een collectie. Elk item in de collectie wordt geëvalueerd en de operator retourneert in plaats daarvan elke waarde die evalueert naar$true
.,PS> 1,2,3,4 -eq 3 3
Dit werkt nog steeds correct in een
if
statement. Dus een waarde wordt geretourneerd door uw operator, dan is het hele statement$true
.$array = 1..6 if ( $array -gt 3 ) { # do something }
Er is een kleine val verborgen in de details hier die ik moet aanwijzen. Als u de
-ne
operator op deze manier gebruikt, is het gemakkelijk om de logica verkeerd achterwaarts te bekijken., Het gebruik van-ne
met een verzameling geeft$true
terug als een item in de verzameling niet overeenkomt met uw waarde.PS> 1,2,3 -ne 4 1 2 3
Dit lijkt misschien een slimme truc, maar we hebben operators
-contains
en-in
die dit efficiënter afhandelen en-notcontains
zal correct doen wat je verwacht.– bevat
de operator
-contains
controleert de verzameling op uw waarde., Zodra het een overeenkomst vindt, geeft het$true
terug.$array = 1..6 if ( $array -contains 3 ) { # do something }
Dit is de beste manier om te zien of een verzameling uw waarde bevat. Het gebruik van
Where-Object
( of-eq
) zal elke keer door de hele lijst lopen en aanzienlijk langzamer zijn.,Variaties:
-
-contains
hoofdlettergevoelig match -
-icontains
hoofdlettergevoelig match -
-ccontains
hoofdlettergevoelig match -
-notcontains
hoofdlettergevoelig niet overeenkomt -
-inotcontains
hoofdlettergevoelig niet overeenkomt -
-cnotcontains
hoofdlettergevoelig niet overeenkomt
in
De
-in
operator is net als de-contains
operator behalve de collectie is op de rechterkant.,$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.,
-not
De
-not
operator flipt een expressie van$false
naar$true
of Van$true
naar$false
. Hier is een voorbeeld waar we een actie willen uitvoeren alsTest-Path
is$false
.if ( -not ( Test-Path -Path $path ) )
De meeste operators waar we het over hadden, hebben een variatie waarbij u de
-not
operator niet hoeft te gebruiken, maar er zijn nog steeds tijden dat u het zou gebruiken.!,
u kunt
!
gebruiken als een alias voor-not
.if ( -not $value ){} if ( !$value ){}
u zult zien dat
!
meer wordt gebruikt door mensen die uit andere talen komen, zoals C#. Ik typ het liever uit omdat ik het moeilijk vind om te zien wanneer ik snel naar mijn scripts kijk.-en
u kunt expressies combineren met de
-and
operator. Als u dat doet, moeten beide zijden$true
zijn om de hele expressie$true
te laten zijn.,if ( ($age -gt 13) -and ($age -lt 55) )
in dat voorbeeld moet
$age
13 of ouder zijn voor de linkerkant en minder dan 55 voor de rechterkant. Ik heb extra haakjes toegevoegd om het duidelijker te maken in dat voorbeeld, maar ze zijn optioneel zolang de uitdrukking eenvoudig is. Hier is hetzelfde voorbeeld zonder hen.if ( $age -gt 13 -and $age -lt 55 )
evaluatie vindt plaats van links naar rechts. Als het eerste item evalueert naar
$false
dan zal het vroeg stoppen en niet de juiste vergelijking uitvoeren., Dit is handig wanneer u ervoor moet zorgen dat er een waarde bestaat voordat u deze gebruikt.Test-Path
bijvoorbeeld zal een fout geven als je het een$null
pad geeft.if ( $null -ne $path -and (Test-Path -Path $path) )
-or
met
-or
kunt u twee expressies opgeven en geeft$true
als een van beide is$true
.if ( $age -le 13 -or $age -ge 55 )
net als bij de operator
-and
vindt de evaluatie plaats van links naar rechts., Behalve dat als het eerste deel$true
is, dan is het hele statement$true
en het zal de rest van de expressie niet verwerken.noteer ook hoe de syntaxis werkt voor deze operators. Je hebt twee verschillende uitdrukkingen nodig. Ik heb gebruikers zien proberen om iets als dit te doen
$value -eq 5 -or 6
zonder hun fout te beseffen.-XOR exclusive of
Deze is een beetje ongebruikelijk.
-xor
laat slechts één expressie toe om te evalueren naar$true
., Dus als beide items$false
zijn of beide items$true
, dan is de hele expressie$false
. Een andere manier om hier naar te kijken is dat de expressie alleen$true
is als de resultaten van de expressie anders zijn.Het is zeldzaam dat iemand deze logische operator ooit zou gebruiken en ik kan geen goed voorbeeld bedenken waarom ik het ooit zou gebruiken.
Bitwise operators
Bitwise operators voeren berekeningen uit op de bits binnen de waarden en produceren een nieuwe waarde als resultaat., Het onderwijzen van bitwise operators valt buiten het bereik van dit artikel, maar hier is de lijst van de hen.
-
-band
binaire EN -
-bor
binaire OF -
-bxor
binaire exclusieve OF -
-bnot
binaire NIET -
-shl
shift links -
-shr
shift rechts
PowerShell expressions
We kunnen gebruik maken van de normale PowerShell in de toestand-en verliesrekening.,
if ( Test-Path -Path $Path )
Test-Path
geeft$true
or$false
wanneer het wordt uitgevoerd. Dit geldt ook voor commando ‘ s die andere waarden retourneren.if ( Get-Process Notepad* )
Het zal evalueren naar
$true
als er een geretourneerd proces is en$false
als er niets is., Het is perfect geldig om pipeline expressies of andere PowerShell statements als deze te gebruiken:if ( Get-Process | Where Name -eq Notepad )
deze expressies kunnen met elkaar worden gecombineerd met de
-and
en-or
, maar het kan nodig zijn om haakjes te gebruiken om te breken ze in sub-expressies.if ( (Get-Process) -and (Get-Service) )
controle op $null
heeft geen resultaat of een
$null
waarde evalueert naar$false
in deif
statement., Wanneer specifiek wordt gecontroleerd op$null
, is het een beste praktijk om de$null
aan de linkerkant te plaatsen.if ( $null -eq $value )
Er zijn nogal wat nuances bij het omgaan met
$null
waarden in PowerShell. Als je geïnteresseerd bent in dieper duiken, Ik heb een artikel over alles wat je wilde weten over $null.variabele toewijzing
Ik vergat deze bijna toe te voegen totdat Prasoon Karunan V me eraan herinnerde.,
normaal gesproken wordt de waarde niet doorgegeven aan de pijplijn of console wanneer u een waarde toewijst aan een variabele. Wanneer u een variabele toewijzing in een subexpressie doet, wordt deze doorgegeven aan de pijplijn.
PS> $first = 1 PS> ($second = 2) 2
zie hoe de
$first
toewijzing geen uitvoer heeft en de$second
toewijzing wel? Wanneer een toewijzing wordt gedaan in eenif
statement, zal het worden uitgevoerd net als de$second
toewijzing hierboven., Hier is een duidelijk voorbeeld van hoe u het zou kunnen gebruiken:if ( $process = Get-Process Notepad* ) { $process | Stop-Process }
als
$process
een waarde wordt toegewezen, dan is de instructie$true
en dan de$process
wordt gestopt.verwar dit niet met
-eq
omdat dit geen gelijkheidscontrole is. Dit is een meer obscure functie die de meeste mensen niet beseffen werkt op deze manier.,Alternate execution path
met de opdracht
if
kunt u een actie opgeven voor niet alleen wanneer de opdracht$true
is, maar ook wanneer het$false
is. Dit is waar hetelse
statement in het spel komt.else
de
else
statement is altijd het laatste deel van deif
statement indien gebruikt.in dit voorbeeld controleren we de
$path
om er zeker van te zijn dat het een bestand is. Als we het dossier vinden, verplaatsen we het. Zo niet, dan schrijven we een waarschuwing., Dit type vertakkingslogica komt veel voor.Genest als
de
if
enelse
statements een scriptblok bevatten, zodat we elk PowerShell commando erin kunnen plaatsen, inclusief een anderif
statement. Hierdoor kunt u gebruik maken van veel ingewikkelder logica te maken.in dit voorbeeld testen we eerst het happy path en nemen er dan actie op. Als dat niet lukt, doen we een andere controle en om meer gedetailleerde informatie te verstrekken aan de gebruiker.
elseif
We zijn niet beperkt tot slechts een enkele voorwaardelijke controle., We kunnen
if
enelse
statement aan elkaar koppelen in plaats van ze te nesten met behulp van hetelseif
statement.de uitvoering vindt plaats van boven naar beneden. Het bovenste
if
statement wordt eerst geëvalueerd. Als dat$false
is, dan gaat het naar de volgendeelseif
ofelse
in de lijst. Die laatsteelse
is de standaardactie als geen van de anderen$true
retourneert.,switch
Op dit punt moet ik het
switch
statement vermelden. Het biedt een alternatieve syntaxis voor het doen van meerdere vergelijkingen met een waarde. Met deswitch
, specificeer je een expressie en dat resultaat wordt vergeleken met verschillende waarden. Als een van deze waarden mach, dan is het overeenkomende codeblok wordt uitgevoerd. Kijk eens naar dit voorbeeld:$itemType = 'Role' switch ( $itemType ) { 'Component' { 'is a component' } 'Role' { 'is a role' } 'Location' { 'is a location' } }
er zijn drie mogelijke waarden die overeenkomen met de
$itemType
., In dit geval zal het overeenkomen metRole
en deis a role
zou worden uitgevoerd. Ik heb een heel eenvoudig voorbeeld gebruikt om je enige blootstelling te geven aan deswitch
operator. Ik praat meer over alles wat je ooit wilde weten over de switch statement in een ander artikel.pijplijn
de pijplijn is een zeer uniek en belangrijk kenmerk van PowerShell. Elke waarde die niet wordt onderdrukt of toegewezen aan een variabele wordt in de pijplijn geplaatst., De
if
biedt ons een manier om te profiteren van de pijplijn op een manier die niet altijd voor de hand ligt.$discount = if ( $age -ge 55 ) { Get-SeniorDiscount } elseif ( $age -le 13 ) { Get-ChildDiscount } else { 0.00 }
elk scriptblok plaatst de resultaten van de commando ‘ s of de waarde in de pijplijn. Vervolgens wijzen we het resultaat van het if statement toe aan de
$discount
variabele. Dat voorbeeld had deze waarden net zo gemakkelijk kunnen toewijzen aan de$discount
variabele direct in elk scriptblok., Ik kan niet zeggen dat ik dit vaak gebruik met hetif
statement, maar ik heb wel een voorbeeld waar ik dit onlangs heb gebruikt.Array inline
Ik heb een functie genaamd Invoke-SnowSql die een uitvoerbaar bestand start met meerdere commandline argumenten. Hier is een clip van die functie waar ik de array van argumenten Bouw.
De variabelen
$Debug
en$Path
zijn parameters voor de functie die door de eindgebruiker worden geleverd. Ik evalueer ze inline binnen de initialisatie van mijn array., Als$Debug
waar is, dan vallen die waarden op de juiste plaats in$snowSqlParam
. Hetzelfde geldt voor de$Path
variabele.Simplify complex operations
Het is onvermijdelijk dat u in een situatie komt die veel te veel vergelijkingen heeft om te controleren en dat uw if statement ver van de rechterkant van het scherm schuift.
ze kunnen moeilijk te lezen zijn en dat maakt je meer geneigd om fouten te maken. Daar kunnen we een paar dingen aan doen.,
voortzetting van de regel
Er zijn een aantal operators in PowerShell die je de opdracht laten omwikkelen naar de volgende regel. De logische operatoren
-and
en-or
zijn goede operatoren om te gebruiken als u uw expressie in meerdere regels wilt opsplitsen.Er is daar nog veel aan de hand, maar het plaatsen van elk stuk op zijn eigen lijn maakt een groot verschil. Over het algemeen doe ik dit alleen als ik meer dan twee vergelijkingen of als ik naar rechts moet scrollen om een van de ligic te lezen.,
pre-calculerende resultaten
We kunnen dat statement uit het if statement halen en alleen het resultaat controleren.
Dit voelt gewoon veel schoner dan het vorige voorbeeld. U krijgt ook de mogelijkheid om een variabele naam te gebruiken die uitlegt wat het is dat u echt controleert. Dit is ook een voorbeeld van zelfdocumenterende code die onnodige opmerkingen opslaat.
meerdere if statements
We kunnen dit opsplitsen in meerdere statements en ze één voor één controleren. In dit geval gebruiken we een vlag of een trackingvariabele om de resultaten te combineren.,
Ik moest de logica omkeren om de vlaglogica correct te laten werken. Elke evaluatie is een individueel
if
statement. Het voordeel hiervan is dat wanneer u debuggen, kunt u precies vertellen wat de logica doet. Ik was in staat om veel betere woorden toe te voegen op hetzelfde moment.het voor de hand liggende nadeel is dat het zoveel meer code is om te schrijven. De code is complexer om naar te kijken als het een enkele lijn van logica neemt en het explodeert in 25 of meer lijnen.
met behulp van functies
kunnen we ook al die validatielogica naar een functie verplaatsen., Kijk eens hoe schoon dit er in één oogopslag uitziet.
if ( Test-SecureDriveConfiguration -ADUser $user ) { # do something }
u moet nog steeds de functie aanmaken om de validatie uit te voeren, maar het maakt deze code veel gemakkelijker om mee te werken. Het maakt deze code gemakkelijker te testen. In je tests kun je de aanroep naar
Test-ADDriveConfiguration
mockeren en je hebt slechts twee tests nodig voor deze functie. Een waar het$true
retourneert en een waar het$false
retourneert. Het testen van de andere functie zal eenvoudiger zijn omdat deze zo klein is.,de body van die functie kan nog steeds die one-liner zijn waarmee we begonnen of de exploded logica die we in de laatste sectie gebruikten. Dit werkt goed voor beide scenario ‘ s en stelt u in staat om die implementatie later eenvoudig te wijzigen.
foutafhandeling
een belangrijk gebruik van de instructie
if
is om te controleren op foutcondities voordat u fouten tegenkomt. Een goed voorbeeld is om te controleren of een map al bestaat voordat je het probeert te maken.,if ( -not (Test-Path -Path $folder) ) { New-Item -Type Directory -Path $folder }
Ik wil graag zeggen dat als je een uitzondering verwacht, het niet echt een uitzondering is. Dus controleer uw waarden en valideer uw voorwaarden waar u kunt.
als je iets meer wilt ingaan op de behandeling van uitzonderingen, heb ik een artikel over alles wat je ooit wilde weten over uitzonderingen.
laatste woorden
het
if
statement is zo ‘ n eenvoudig statement, maar is een zeer fundamenteel stuk van PowerShell. Je zult merken dat je dit meerdere keren gebruikt in bijna elk script dat je schrijft., Ik hoop dat je een beter begrip hebt dan voorheen. - !,pressions
- niet