Powershell: alles wat u wilde weten over het if statement

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
  • 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 deifstatement doet is de expressie evalueren in haakjes., Als het evalueert naar $true, dan zal het scriptblock 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 het Write-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 volledige scriptblock voorzien van accolades om het correct te laten werken.

      Vergelijkingsoperators

      het meest voorkomende ding dat u hetif 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 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-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 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:

      • -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 gevoelig

    ik 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 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 -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 -containsen-indie dit efficiënter afhandelen en-notcontainszal correct doen wat je verwacht.

    – bevat

    de operator -contains controleert 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:

    • -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 als Test-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 $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 $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 -andvindt 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-Pathgeeft$trueor$falsewanneer 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 -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 $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 een if 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 $processeen waarde wordt toegewezen, dan is de instructie$trueen dan de$processwordt 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 $falseis. Dit is waar het else statement in het spel komt.

    else

    deelse 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

    deif 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 en else statement aan elkaar koppelen in plaats van ze te nesten met behulp van het elseif statement.

    de uitvoering vindt plaats van boven naar beneden. Het bovensteif statement wordt eerst geëvalueerd. Als dat $false is, dan gaat het naar de volgende elseif of else in de lijst. Die laatste else is de standaardactie als geen van de anderen $trueretourneert.,

    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 de switch, 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 met Role en de is a role zou worden uitgevoerd. Ik heb een heel eenvoudig voorbeeld gebruikt om je enige blootstelling te geven aan de switch 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 het if 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 individueelif 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 $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 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.

    Share

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *