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
ifstatement doet.het if statement
Hier is een zeer basaal voorbeeld van de
ifstatement:$condition = $true if ( $condition ) { Write-Output "The condition was true" }het eerste wat de
ifstatement doet is de expressie evalueren in haakjes., Als het evalueert naar$true, dan zal hetscriptblockin de accolades uitvoeren. Als de waarde$falsewas, dan zou het dat scriptblok overslaan.in het vorige voorbeeld was de verklaring
ifslechts een evaluatie van de variabele$condition. Het was$trueen zou hetWrite-Outputcommando in het scriptblok hebben uitgevoerd.in sommige talen kunt u een enkele regel code plaatsen na het
ifstatement en het zal worden uitgevoerd., Dat is in PowerShell niet het geval. U moet een volledigescriptblockvoorzien van accolades om het correct te laten werken.Vergelijkingsoperators
het meest voorkomende ding dat u het
ifcommando 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
-eqcontroleert 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
5en vergelijk deze met mijn$valueom 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-Serviceop 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.,
-
-eqhoofdletterongevoelige gelijkheid -
-ieqhoofdletterongevoelige gelijkheid -
-ceqhoofdlettergevoelige gelijkheid
-ne niet gelijk
veel operators hebben een verwante operator dat is controleren op het tegenovergestelde resultaat.
-necontroleert 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
5is., 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:
-
-neongevoelig voor hoofdletters niet gelijk -
-ineongevoelig voor hoofdletters niet gelijk -
-cnegevoelig 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 -lestaat voor groter dan, groter Danorequal, minder dan, en minder Danorequal.,eter dan of gelijk aan, niet hoofdlettergevoelig-cgegroter dan of gelijk is hoofdlettergevoelig-ltminder dan-iltminder dan, niet hoofdlettergevoelig-cltminder dan, hoofdletter gevoelig-lekleiner dan of gelijk aan-ilekleiner dan of gelijk aan, niet hoofdlettergevoelig-clekleiner 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
-likeoperator. 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:
-
-likehoofdlettergevoelig wildcard -
-ilikehoofdlettergevoelig wildcard -
-clikehoofdlettergevoelig wildcard -
-notlikehoofdlettergevoelig wildcard niet overeenkomt -
-inotlikehoofdlettergevoelig wildcard niet overeenkomt -
-cnotlikehoofdlettergevoelig wildcard niet overeenkomt
-overeen met reguliere expressie
De
-matchoperator 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
-matchen de vele manieren om regex in een ander artikel te gebruiken.,Variations:
-
-matchcase insensitive regex -
-imatchcase insensitive regex -
-cmatchcase sensitive regex -
-notmatchcase insensitive regex not matched -
-inotmatchcase insensitive regex not matched -
-cnotmatchcase sensitive regex not matched
-is of type
You are able to check a value’s type with the
-isoperator.,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:
-
-istype -
-isnotniet van het type
Verzameling operatoren
Wanneer u de vorige exploitanten met een enkele waarde, het resultaat is
$trueof$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 3Dit werkt nog steeds correct in een
ifstatement. 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
-neoperator op deze manier gebruikt, is het gemakkelijk om de logica verkeerd achterwaarts te bekijken., Het gebruik van-nemet een verzameling geeft$trueterug als een item in de verzameling niet overeenkomt met uw waarde.PS> 1,2,3 -ne 4 1 2 3Dit lijkt misschien een slimme truc, maar we hebben operators
-containsen-indie dit efficiënter afhandelen en-notcontainszal correct doen wat je verwacht.– bevat
de operator
-containscontroleert de verzameling op uw waarde., Zodra het een overeenkomst vindt, geeft het$trueterug.$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:
-
-containshoofdlettergevoelig match -
-icontainshoofdlettergevoelig match -
-ccontainshoofdlettergevoelig match -
-notcontainshoofdlettergevoelig niet overeenkomt -
-inotcontainshoofdlettergevoelig niet overeenkomt -
-cnotcontainshoofdlettergevoelig niet overeenkomt
in
De
-inoperator is net als de-containsoperator behalve de collectie is op de rechterkant.,$array = 1..6 if ( 3 -in $array ) { # do something }Variations:
-
-incase insensitive match -
-iincase insensitive match -
-cincase sensitive match -
-notincase insensitive not matched -
-inotincase insensitive not matched -
-cnotincase sensitive not matched
Logical operators
Logical operators are used to invert or combine other expressions.,
-not
De
-notoperator flipt een expressie van$falsenaar$trueof Van$truenaar$false. Hier is een voorbeeld waar we een actie willen uitvoeren alsTest-Pathis$false.if ( -not ( Test-Path -Path $path ) )De meeste operators waar we het over hadden, hebben een variatie waarbij u de
-notoperator 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
-andoperator. Als u dat doet, moeten beide zijden$truezijn om de hele expressie$truete laten zijn.,if ( ($age -gt 13) -and ($age -lt 55) )in dat voorbeeld moet
$age13 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
$falsedan 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-Pathbijvoorbeeld zal een fout geven als je het een$nullpad geeft.if ( $null -ne $path -and (Test-Path -Path $path) )-or
met
-orkunt u twee expressies opgeven en geeft$trueals een van beide is$true.if ( $age -le 13 -or $age -ge 55 )net als bij de operator
-andvindt de evaluatie plaats van links naar rechts., Behalve dat als het eerste deel$trueis, dan is het hele statement$trueen 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 6zonder hun fout te beseffen.-XOR exclusive of
Deze is een beetje ongebruikelijk.
-xorlaat slechts één expressie toe om te evalueren naar$true., Dus als beide items$falsezijn of beide items$true, dan is de hele expressie$false. Een andere manier om hier naar te kijken is dat de expressie alleen$trueis 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.
-
-bandbinaire EN -
-borbinaire OF -
-bxorbinaire exclusieve OF -
-bnotbinaire NIET -
-shlshift links -
-shrshift rechts
PowerShell expressions
We kunnen gebruik maken van de normale PowerShell in de toestand-en verliesrekening.,
if ( Test-Path -Path $Path )Test-Pathgeeft$trueor$falsewanneer het wordt uitgevoerd. Dit geldt ook voor commando ‘ s die andere waarden retourneren.if ( Get-Process Notepad* )Het zal evalueren naar
$trueals er een geretourneerd proces is en$falseals 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
-anden-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
$nullwaarde evalueert naar$falsein deifstatement., Wanneer specifiek wordt gecontroleerd op$null, is het een beste praktijk om de$nullaan de linkerkant te plaatsen.if ( $null -eq $value )Er zijn nogal wat nuances bij het omgaan met
$nullwaarden 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) 2zie hoe de
$firsttoewijzing geen uitvoer heeft en de$secondtoewijzing wel? Wanneer een toewijzing wordt gedaan in eenifstatement, zal het worden uitgevoerd net als de$secondtoewijzing hierboven., Hier is een duidelijk voorbeeld van hoe u het zou kunnen gebruiken:if ( $process = Get-Process Notepad* ) { $process | Stop-Process }als
$processeen waarde wordt toegewezen, dan is de instructie$trueen dan de$processwordt gestopt.verwar dit niet met
-eqomdat 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
ifkunt u een actie opgeven voor niet alleen wanneer de opdracht$trueis, maar ook wanneer het$falseis. Dit is waar hetelsestatement in het spel komt.else
de
elsestatement is altijd het laatste deel van deifstatement indien gebruikt.in dit voorbeeld controleren we de
$pathom 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
ifenelsestatements een scriptblok bevatten, zodat we elk PowerShell commando erin kunnen plaatsen, inclusief een anderifstatement. 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
ifenelsestatement aan elkaar koppelen in plaats van ze te nesten met behulp van hetelseifstatement.de uitvoering vindt plaats van boven naar beneden. Het bovenste
ifstatement wordt eerst geëvalueerd. Als dat$falseis, dan gaat het naar de volgendeelseifofelsein de lijst. Die laatsteelseis de standaardactie als geen van de anderen$trueretourneert.,switch
Op dit punt moet ik het
switchstatement 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 metRoleen deis a rolezou worden uitgevoerd. Ik heb een heel eenvoudig voorbeeld gebruikt om je enige blootstelling te geven aan deswitchoperator. 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
ifbiedt 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
$discountvariabele. Dat voorbeeld had deze waarden net zo gemakkelijk kunnen toewijzen aan de$discountvariabele direct in elk scriptblok., Ik kan niet zeggen dat ik dit vaak gebruik met hetifstatement, 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
$Debugen$Pathzijn parameters voor de functie die door de eindgebruiker worden geleverd. Ik evalueer ze inline binnen de initialisatie van mijn array., Als$Debugwaar is, dan vallen die waarden op de juiste plaats in$snowSqlParam. Hetzelfde geldt voor de$Pathvariabele.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
-anden-orzijn 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
ifstatement. 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-ADDriveConfigurationmockeren en je hebt slechts twee tests nodig voor deze functie. Een waar het$trueretourneert en een waar het$falseretourneert. 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
ifis 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
ifstatement 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