Terug naar de basis: conditionele logica met PowerShell If-verklaring

Dit artikel is bijgewerkt voor 2023!

Scripts kunnen beslissingen nemen. Hoe? Door gebruik te maken van een concept dat conditionele logica wordt genoemd. De PowerShell if-verklaring en de if/else-constructies zijn de gebruikelijke manieren om voorwaarden te definiëren.

Wanneer u PowerShell-scripts schrijft, doet u dat met een specifieke taak in gedachten. Maar een operatie kan meerdere mogelijke acties hebben op basis van één of meer voorwaarden. Deze situatie is waar de PowerShell If-verklaring constructie van pas komt.

In dit artikel leert u de PowerShell If-Else-constructie en begrijpt u de syntaxis en hoe het werkt. U leert ook enkele manieren waarop u de PowerShell If-verklaring kunt gebruiken om conditionele logica in uw scripts toe te voegen aan de hand van de voorbeelden.

Het begrijpen van de syntaxis van de PowerShell If-verklaring

De PowerShell if-else-constructie evalueert één of meer conditionele expressies. Hieronder ziet u de syntaxis van de If-verklaring. Deze stijl wordt vaak aangeduid als stroomregeling.

if (<test1>)
    {<statement list 1>}
[elseif (<test2>)
    {<statement list 2>}]
[else
    {<statement list 3>}]

Zoals u kunt zien aan de syntaxis hierboven, is elke test ingesloten tussen haakjes (). Tests kunnen gebruikmaken van verschillende operatoren, zoals vergelijkingsoperatoren en logische operatoren,

De verklaringslijsten bevatten de code die moet worden uitgevoerd als het resultaat van de test evalueert naar waar.

Dan zijn er drie mogelijke verklaringen in een If-verklaring groep. Dit zijn de IF, ELSEIF en ELSE verklaringen.

  • De if verklaring bevat de eerste test om te evalueren, gevolgd door de eerste verklaringslijst ingesloten binnen de accolades {}. De PowerShell if verklaring is de enige verklaring die aanwezig moet zijn.
  • De elseif verklaring is waar u voorwaarden toevoegt. U kunt meerdere ElseIf verklaringen toevoegen wanneer u meerdere voorwaarden heeft. PowerShell zal elke van deze voorwaarden sequentieel evalueren.
  • De else verklaring accepteert geen enkele voorwaarde. De verklaringslijst in deze verklaring bevat de code om uit te voeren als alle voorgaande geteste voorwaarden onwaar zijn.

Het begrijpen van de PowerShell If-verklaring Logische Stroom

Om verder te begrijpen hoe de PowerShell If-Else werkt, maakt u uzelf vertrouwd met de logische stroom ervan. Het onderstaande diagram illustreert de basisstroom van de PowerShell If-Else.

PowerShell If Statement Logic Flow

Wanneer de if-verklaring wordt uitgevoerd, doorloopt PowerShell elke voorwaarde en evalueert of de code waar of onwaar retourneert. Een samenvatting van het gedrag is hieronder:

  • PowerShell evalueert de voorwaarde in Test 1.
  • Als het resultaat van Test 1 true retourneert, zal de code binnen de If-verklaringslijst worden uitgevoerd, waarna PowerShell de If-verklaring verlaat.
  • Als het resultaat van Test 1 false retourneert, zal PowerShell doorgaan met het evalueren van de voorwaarde (Test n) in de volgende ElseIf verklaring.
  • Als het resultaat van Test n false retourneert, blijft PowerShell de voorwaarde (Test n) evalueren in de volgende ElseIf-verklaring, als er nog een ElseIf-verklaring bestaat -OF-
  • Als het resultaat van Test n false retourneert, wordt de code in de Else-verklaring uitgevoerd en zal PowerShell de If-verklaring verlaten -OF-
  • Als het resultaat van Test n true retourneert, wordt de code in de ElseIf-verklaring uitgevoerd en zal PowerShell de If-verklaring verlaten.

Het gebruik van de PowerShell If-Else-verklaring

De volgende secties zijn verschillende voorbeelden van hoe de PowerShell If-verklaring wordt gebruikt bij het schrijven van scripts. De technieken die je leert kunnen je begeleiden bij het gebruik van de If-verklaring als je een real-life situatie tegenkomt waarin het nodig is.

Enkele If-Else-voorwaarde

Beginnend met het meest elementaire is de enkele PowerShell If-verklaring. Je zou een enkele if-verklaring moeten gebruiken wanneer er slechts één voorwaarde is om te testen.

Het onderstaande voorbeeld test of de waarde van de variabele $num groter is dan 10. Als het resultaat waar is, wordt de melding "$num is groter dan 10" weergegeven op het scherm. Als het resultaat onwaar is, doet PowerShell niets omdat er slechts één voorwaarde is om te testen.

$num = 11
if ($num -gt 10) {
    "$num is greater than 10"
}

Als je alleen controleert op een specifieke waarde, zoals if ($Value) { }, dan zal PowerShell controleren of de $Value niet $Null, 0, $False, een lege string of een lege array is.

Het plakken van de bovenstaande code in PowerShell geeft je het onderstaande resultaat.

Single If Condition Example

Nu kun je de Else-verklaring toevoegen als je een standaard “fallback”-actie wilt toevoegen in plaats van PowerShell niets te laten doen wanneer het testresultaat onwaar is.

In het onderstaande voorbeeld wordt de code in de Else-verklaring uitgevoerd als de waarde van de variabele $num NIET groter is dan 10.

$num = 9
if ($num -gt 10)
{
    "$num is greater than 10"
}
else
{
    "$num is NOT greater than 10"
}

Het uitvoeren van de aangepaste code in PowerShell geeft de onderstaande uitvoer.

Single If statement condition

Vanaf PowerShell 7.0 is een nieuwe syntaxis voor de If-verklaring geïntroduceerd met behulp van een ternaire operator. Enkele If-verklaringen kunnen goed gebruikmaken van deze nieuwe syntaxis.

Met hetzelfde voorbeeld hierboven, zo ziet de code eruit met de ternaire operator.

$num = 11
$num -gt 10 ? "$num is greater than 10" : "$num is NOT greater than 10"
If statement syntax using ternary operator

Het testen van $Null in een PowerShell If-verklaring

Je zou kunnen denken dat het testen van een $Null-voorwaarde eenvoudig is. Maar aan welke kant je de $Null-waarde plaatst, is belangrijk omdat het mogelijk niet in elke voorwaarde hetzelfde resultaat oplevert. Het is een goede praktijk om altijd de $Null-voorwaarde aan de linkerkant te plaatsen zoals dit.

$Null -NE $Value

Als je de $Null-test aan de rechterkant plaatst, en de waarde aan de linkerkant is een lijst, zoals een array, dan zal $Null als een filter werken. Zoals je kunt zien aan het onderstaande voorbeeld, als $Null aan de linkerkant wordt geplaatst, krijg je consistente booleaanse resultaten.

$List = @(1,2,2,3,4)
$List -NE $Null
$List -EQ $Null
$Null -NE $Null
$Null -EQ $Null
$Null testing conditions for PowerShell If Statement

Meerdere If-Else-voorwaarden met ElseIf

Bij het evalueren van meerdere voorwaarden moet je een of meer ElseIf-verklaringen toevoegen. Elke ElseIf-verklaring bevat de testuitdrukking en de bijbehorende code om uit te voeren.

Het onderstaande script blijft bij uitvoering doorgaan met het vragen om een ​​fruitnaam totdat de CTRL+C-toetscombinatie wordt ingedrukt, of totdat de gebruiker de letter “X” invoert.

Vervolgens zal de If-verklaring elke voorwaarde achtereenvolgens doorlopen totdat er een overeenkomst is gevonden. Als de invoer niet overeenkomt met een van de voorwaarden, wordt de code binnen de Else-verklaring uitgevoerd.

While ($fruit -ne "X") {
    $fruit = Read-Host "Name that fruit"

    if ($fruit -eq 'Apple') {
        'I have an Apple'
    }
    elseif ($fruit -eq 'Banana') {
        'I have a Banana'
    }
    elseif ($fruit -eq 'Orange') {
        'I have an Orange'
    }
    else {
        'Sorry, that fruit is not in the list'
    }
}

Hieronder volgt een demonstratie van hoe het bovenstaande script zich gedraagt ​​bij uitvoering in PowerShell.

Multiple If-Else conditions

Rapportage Status van Vrije Schijfruimte

Het rapporteren van vrije schijfruimte is een veelvoorkomende taak voor systeembeheerders. De gebruikelijke manier om de ruimteinformatie van vaste schijven op een Windows-machine te rapporteren, draait om de onderstaande code.

Get-CimInstance -ClassName CIM_LogicalDisk | Where-Object {$_.DriveType -eq 3}

De informatie die de bovenstaande code zal retourneren, ziet eruit zoals weergegeven in de volgende schermafbeelding.

Plain disk space information report

Zoals je kunt zien, toont de bovenstaande uitvoer de schijfletter, vrije ruimtewaarden en andere eigenschappen. Hoewel de bovenstaande uitvoer in orde is, is het niet intuïtief. Hoe de informatie wordt gepresenteerd, geeft niet aan of de schijfruimte kritiek is, waarschuwingen geeft of normaal is.

Het gebruik van een PowerShell If-verklaring om de code te verbeteren

A more intuitive output can be achieved using the PowerShell If-Else statement by adding conditions to check if the free space is over or below certain thresholds. And these thresholds will define the status of the free disk space.

Het onderstaande voorbeeldscript voert het volgende uit:

  • Met de waarde van de variabele $Critical wordt de drempel bepaald waaraan het percentage vrije ruimte als kritiek wordt aangemerkt.
  • Gebruik de waarde van de variabele $Waarschuwing om de drempel te definiëren waarop het percentage vrije ruimte als warning wordt getagd.
  • Haal alle informatie over vaste schijven op van de lokale machine
  • Loop door alle schijfinformatie om de vrije ruimte te bepalen en tag de status ervan.
    • Als het percentage vrije ruimte hoger is dan de waarde van de variabele $Waarschuwing, wordt de status van de schijfruimte getagd als normaal.
    • Als het percentage vrije ruimte hoger is dan de waarde van de variabele $Kritiek, wordt de status van de schijfruimte getagd als warning.
    • Als het percentage vrije ruimte minder is dan of gelijk is aan de waarde van de variabele $Kritiek, wordt de status van de schijfruimte getagd als kritiek.
  • Stel de eigenschappen van het object samen 'Drive Letter', 'Drive Name', 'Totaal ruimte (GB)', 'Vrije ruimte (GB)', 'Vrije ruimte (%)', en 'Status'.
  • Return het eindrapport.

Kopieer de onderstaande code en sla het script op met de bestandsnaam Get-DiskSpace.ps1. Vergeet niet de waarden van de variabelen $Critical en $Warning te wijzigen om te testen met verschillende drempels.

# Definieer drempels in procenten
$Critical = 20
$Warning = 70

# Alle informatie over vaste schijven ophalen
$diskObj = Get-CimInstance -ClassName CIM_LogicalDisk | Where-Object { $_.DriveType -eq 3 }

# Initialiseer een lege array die de uiteindelijke resultaten zal bevatten
$finalReport = @()

# Itereer over elke schijfinformatie
$diskObj.foreach(
    {
        # Bereken het vrije schijfruimtepercentage
        $percentFree = [int](($_.FreeSpace / $_.Size) * 100)

        # Bepaal de "Status"
        if ($percentFree -gt $Warning) {
            $Status = 'Normal'
        }
        elseif ($percentFree -gt $Critical) {
            $Status = 'Warning'
        }
        elseif ($percentFree -le $Critical) {
            $Status = 'Critical'
        }

        # Composeer de eigenschappen van het object dat aan het rapport moet worden toegevoegd
        $tempObj = [ordered]@{
            'Drive Letter'     = $_.DeviceID
            'Drive Name'       = $_.VolumeName
            'Total Space (GB)' = [int]($_.Size / 1gb)
            'Free Space (GB)'  = [int]($_.FreeSpace / 1gb)
            'Free Space (%)'   = "{0}{1}" -f [int]$percentFree, '%'
            'Status'           = $Status
        }

        # Voeg het object toe aan het eindrapport
        $finalReport += New-Object psobject -property $tempObj
    }
)

return $finalReport

U kunt ook het resultaat van de if/else-voorwaarde toewijzen aan een variabele, bijv. $Status = if ($percentFree -gt $Warning) { 'Normaal' } om mogelijk een kortere voorwaarde te maken.

Zodra het script is opgeslagen, test het door de naam ervan in PowerShell te bellen. Hieronder volgt een voorbeelddemonstratie van hoe dit script werkt.

Free Disk Space Status Command Output

Zoals je kunt zien aan de output, wordt de status voor elke schijf bepaald door het vrije schijfruimtepercentage, wat het resultaat was van het gebruik van meerdere voorwaarden met PowerShell If-Else.

Meerdere en geneste If-Else

Laten we zeggen dat je een if-else statement hebt met een voorwaarde gedefinieerd in het else blok. Wanneer het if-else statement wordt uitgevoerd, wordt het else blok aangeroepen als de code binnen het if blok false retourneert.

Binnen het else blok moet je een andere conditionele test uitvoeren. Als gevolg daarvan heb je nog een If-Else statement nodig. Deze situatie wordt een genest If-Else genoemd. Het geneste If-Else statement wordt vaak gebruikt als de innerlijke If-Else afhankelijk is van het resultaat van de bewerking in de buitenste If-Else.

Het gebruik van meerdere en geneste If-Else statements kan behoorlijk verwarrend zijn. Het belangrijkste punt is om de plaatsing van de structuur te onthouden en ervoor te zorgen dat je je code inspringt. Het inspringen van je code zal je helpen om gemakkelijk je If-Else statements te herkennen en te scheiden.

Voorbeeld van Meerdere/Geneste If-Else Statements

Het onderstaande voorbeeldscript toont hoe meerdere en geneste If-Else afhankelijk kunnen zijn van het resultaat van elkaar. De logica van de code hieronder is als volgt.

  • Als de $SendEmail $false is, zal het script niets doen en stoppen.
  • Als de $SendEmail $true is, dan mogen de variabelen $From en $To niet leeg of nul zijn. Anders wordt de $abortFlag ingesteld op 1.
  • Als de $SendEmail $true is en de $CCEnabled $true is, dan mag de variabele $CC niet leeg of nul zijn. Anders wordt de $abortFlag ingesteld op 1.
  • Als de variabele $SendEmail is ingesteld op $true en $BCCEnabled is ingesteld op $true, dan mag de variabele $BCC niet leeg of null zijn. Anders wordt de variabele $abortFlag ingesteld op 1.
  • Als de waarde van de variabele $abortFlag 1 is, zal het script op dit punt worden afgebroken en niet verdergaan.
  • Als de waarde van de variabele $abortFlag 0 is, gaat het script door tot het einde.

Kopieer de onderstaande code en sla deze op als Send-MyMail.ps1. Verander nog geen waarden.

$SendEmail = $true

$From = ""
$To = ""

$CCEnabled = $true
$CC = ""

$BCCEnabled = $true
$BCC = ""

$abortFlag = 0

if ($SendEmail) {
    if (!$From) {
        Write-Host "[From] is missing" -ForegroundColor Red
        $abortFlag = 1
    }

    if (!$To) {
        Write-Host "[To] is missing" -ForegroundColor Red
        $abortFlag = 1
    }

    if ($CCEnabled) {
        if (!$CC) {
            Write-Host "[CC] is missing" -ForegroundColor Red
            $abortFlag = 1
        }
    }

    if ($BCCEnabled) {
        if (!$BCC) {
            Write-Host "[BCC] is missing" -ForegroundColor Red
            $abortFlag = 1
        }
    }

    if ($abortFlag -eq 1) {
        Write-Host "The abort flag has been tripped. Exit script." -ForegroundColor Red
        break
    }
    else {
        Write-Host "Your email will be sent from this address $From" -ForegroundColor Green
        Write-Host "And will be sent to the following people:" -ForegroundColor Green
        Write-Host "To: $To" -ForegroundColor Green

        if ($CCEnabled -and $CC) {
            Write-Host "CC: $CC" -ForegroundColor Green
        }

        if ($BCCEnabled -and $BCC) {
            Write-Host "BCC: $BCC" -ForegroundColor Green
        }
    }
}

Nadat je het bestand hebt opgeslagen, voer je het uit in PowerShell, zoals hieronder getoond. De demonstratie hieronder toont het resultaat van het script wanneer de variabele waarden niet veranderen.

Nested If-Else example

Vervolgens bewerk je het script en update je alle variabelen correct, zoals in dit fragment hieronder.

$SendEmail = $true

$From = "[email protected]"
$To = "[email protected]"

$CCEnabled = $true
$CC = "[email protected]"

$BCCEnabled = $true
$BCC = "[email protected]"

---SNIP---

Na het bewerken van de variabelen, sla je het script op en voer je het opnieuw uit. Het zou hetzelfde resultaat moeten laten zien, zoals hieronder te zien is.

Another nested If-else example

Wijzig nu de variabelen en probeer combinaties uit om te testen hoe de geneste If-Else wordt beïnvloed. Het aanpassen en testen op eigen initiatief zou helpen om de logica verder te begrijpen.

Samenvatting

In dit artikel heb je geleerd over de voorwaardelijke logicaconstructie – de PowerShell If Statement-constructie. De If-Else-verklaring stelt scripters in staat om voorwaardelijke logica te formuleren en de acties van hun scripts te sturen op basis van testresultaten.

Met de voorbeelden in dit artikel zou je manieren en technieken moeten hebben geleerd om de If-Else-verklaring te gebruiken bij het maken van een op beslissingen gebaseerde code. If-Else kan eenvoudig zijn met een enkele voorwaarde en wordt complexer naarmate je dieper ingaat op de geneste If-Else-verklaringen.

Wat vind je van de If-Else verklaring? Is dit iets waarvan je denkt dat je het meer en meer zult gebruiken na het lezen van dit artikel? Welke andere doeleinden kun je overwegen waar je de kennis die je hier hebt opgedaan kunt toepassen?

Verder lezen

Source:
https://adamtheautomator.com/powershell-if-else/