De PowerShell While-lus: Een Terug naar de Basis Gids

PowerShell is een krachtige scripttaal die veel functies biedt voor automatisering en het beheer van op Windows gebaseerde systemen. Een van de meest gebruikte constructies is de PowerShell while-lus.

Maak je geen zorgen als je vastzit in een eindeloze lus terwijl je PowerShell-scripting leert. Laat de PowerShell while-lus je leiden naar je grote ontsnapping. En in deze tutorial ga je terug naar de basisprincipes van werken met while-lussen in PowerShell terwijl je je scripts schrijft.

Lees verder om je PowerShell-scriptingvaardigheden naar een hoger niveau te tillen!

Vereisten

Deze tutorial zal een hands-on demonstratie zijn. Zorg ervoor dat je het volgende hebt om mee te doen:

  • A Windows machine – This tutorial uses Windows 10.
  • Windows PowerShell 5.0 of hoger geïnstalleerd – Deze tutorial maakt gebruik van PowerShell 7.
  • A user account with administrator privileges.

Uitvoeren van enkele voorwaardelijke while-lussen

Een van de eenvoudigste soorten while-lus is het type met een enkele voorwaarde. In tegenstelling tot de If-verklaring voert dit type lus een reeks opgegeven commando’s uit zolang een gespecificeerde voorwaarde waar is. Wanneer ‘False’ wordt geretourneerd, wordt de lus onderbroken en wordt de uitvoering voortgezet met de rest van het script.

Hieronder staat de syntaxis voor een enkele voorwaardelijke while-lus:

  • Het eerste dat opvalt, is het gebruik van haakjes. De voorwaarde moet tussen haakjes staan, terwijl het codeblok een reeks PowerShell-opdrachten is die worden uitgevoerd terwijl de voorwaarde waar is.
  • Het tweede dat opvalt, is dat de voorwaarde een booleaanse waarde moet retourneren, die wordt geëvalueerd als True of False.
while (condition)
{

	# Codeblok om uit te voeren

}

Voer de onderstaande code uit, waarbij de waarde van $val begint bij 0 en telkens met 1 wordt verhoogd wanneer het codeblok wordt uitgevoerd totdat de waarde van de variabele $val gelijk is aan 3.

Wanneer $val een waarde van 3 bereikt, wat de voorwaarde False maakt, wordt de lus onderbroken en wordt de uitvoering voortgezet met de rest van het script.

# Declareert de variabele $val met de initiële waarde van 0
$val = 0

# Stelt de while-lus in om te worden uitgevoerd totdat de waarde van de variabele $val 3 bereikt
while($val -ne 3)
{
	# Verhoogt de waarde van de variabele $val met 1
	$val++
	
	# Drukt de huidige waarde van de variabele $val af
	Write-Host $val
}
Understanding Single Condition While Loops.

Het uitvoeren van een PowerShell While-lus met ingebouwde variabelen ($true/$false)

Het vorige voorbeeld, waarbij voorwaarden worden gebruikt in de while-lus, werkt prima. Maar je kunt ook PowerShell’s ingebouwde variabelen gebruiken, zoals $true en $false, om een While-lus te maken.

De onderstaande syntaxis voert uit totdat $true niet langer $true is. Met andere woorden, de lus blijft voor altijd draaien. Maar je moet altijd een manier opnemen om uit een oneindige lus te breken. Anders zit je er voor altijd aan vast. Je leert later in deze tutorial meer over hoe je kunt breken uit een lus met behulp van break en continue.

while($true)
{

	# Codeblok om uit te voeren

}

Voer het onderstaande codeblok uit, dat voor altijd blijft draaien en de waarde van $i naar de console print.

# Declareert de variabele $i met de initiële waarde van 0
$i = 0

# Stelt de While-lus in om te draaien zolang de voorwaarde $true is
while($true)
{
	# Verhoogt de waarde van $i met 1
	$i++
	
	# Print de huidige waarde van de variabele $i
	Write-Host $i
}

Druk nu op Ctrl+C om uit de lus te breken. Deze lus verbruikt veel systeembronnen, dus wees voorzichtig bij het gebruik ervan.

Executing a while loop with PowerShell’s built-in ($true) variable

Het uitvoeren van Multi-Conditionele While-lussen

Naast enkelvoudige voorwaardelijke while-lussen, kunt u ook meer voorwaarden toevoegen aan while-lussen. Net als bij de enkelvoudige voorwaardelijke while-lus moeten de voorwaarden een Booleaanse waarde retourneren, ofwel Waar of Onwaar.

Hieronder staat de syntaxis voor een meer-voorwaardelijke while-lus, vergelijkbaar met de syntaxis voor een enkelvoudige voorwaardelijke while-lus. Het belangrijkste verschil is dat u meerdere voorwaarden kunt opnemen die gescheiden zijn door de volgende operatoren:

  • EN (-and) – Beide voorwaarden moeten waar zijn.
  • OF (-or) (Eén van de voorwaarden kan waar zijn).
# EN-operator
while (condition1 -AND condition2)
{

	# Codeblok om uit te voeren

}

# OF-operator
while (condition1 -OR condition2)
{

	# Codeblok om uit te voeren

}

Voer de onderstaande code uit, die blijft lussen zolang $val niet gelijk is aan (-ne) 3 -en $i niet gelijk is aan (-ne) 5.

Wanneer beide variabelen hun respectievelijke voorwaarden bereiken, wordt de lus onderbroken en wordt de uitvoering voortgezet met de rest van het script.

# Declareert de variabelen $val en $i met initiële waarden van 0
$val = 0
$i = 0

# Stelt de While-lus in om uit te voeren totdat $val gelijk is aan 3 en $i gelijk is aan 5
while($val -ne 3 -and $i -ne 6)
{
	# Verhoogt $val met 1
  $val++
	# Verhoogt $i met 2
  $i += 2
	# Drukt de huidige waarde van de variabelen $val en $i af
  Write-Host "$val, $i"
}

Uitvoeren van een while-lus met EN-operator

Executing a while loop with AND operator

Voer nu de onderstaande code uit, die de gebruiker vraagt naar hun leeftijd, opgeslagen in de variabele $leeftijd.

Als de gebruiker een getal invoert dat kleiner is dan (-lt) 1 of geen getal is (-nomatch), wordt de gebruiker opnieuw gevraagd om een geldig getal in te voeren. Deze werkwijze is handig om gebruikers meerdere kansen te geven om geldige invoer te geven.

# Vraagt de gebruiker om hun leeftijd in te voeren
$age = Read-Host "Please Enter Your Age"

# Stelt de While-lus in om uit te voeren totdat de gebruiker geldige invoer geeft
while($age -notmatch "\\d+" -or $age -lt 1)
{
	# Vraagt de gebruiker opnieuw om een geldige leeftijd in te voeren
  $age = Read-Host "Please Enter Your Valid Age"
}
# Drukt de geldige leeftijdsinvoer af
Write-Host "Your age is $age

In de onderstaande uitvoer kun je zien dat de gebruiker drie keer werd gevraagd om hun leeftijd in te voeren, als volgt:

  • De eerste keer voerde de gebruiker ten in, wat geen getal is.
  • De tweede keer voerde de gebruiker 0 in, wat onder 1 ligt.
  • De derde keer voerde de gebruiker 10 in, wat een geldige leeftijd is.
Executing a while loop with the OR operator

Het gebruik van BREAK- en CONTINUE-sleutelwoorden in while-lussen

Je hebt gezien hoe while-lussen flexibiliteit toevoegen aan je PowerShell-script. Maar om de uitvoering van je while-lussen beter te beheersen, voeg je de sleutelwoorden break en continue toe.

Bijvoorbeeld, als je slechts een bepaald aantal items in een array wilt verwerken, kun je het BREAK-sleutelwoord gebruiken om de lus te verlaten wanneer het gewenste aantal items is verwerkt.

Deze sleutelwoorden functioneren als volgt:

Keyword Function
break Immediately exits the loop and continues execution with the rest of the script.
continue Skips over the remaining code block in the current iteration of the loop and continues with the next iteration.

Voer de onderstaande code uit, die door een array van 10 items loopt.

In de onderstaande code controleert de if-verklaring de waarde van $i. Als de waarde van $i 5 is, slaat het continue-sleutelwoord de resterende code in de lus over en gaat door met de volgende iteratie. Als de waarde van $i 8 is, verlaat het break-sleutelwoord de lus en gaat verder met de rest van het script.

Anders drukt de while-lus af (Write-Host) en verhoogt de waarde van de variabele $i met 1.

# Declareren van een $array van 10 items
$array = 1..10
# Declareren van de $i variabele met de initiële waarde van 0
$i = 0
# Stelt de While-lus in om uit te voeren totdat de voorwaarde is voldaan
while($i -lt $array.Count)
{
	# Controleert of $i gelijk is aan 5
  if($i -eq 5)
  {
		# Als ja, verhoog $i met 1
    $i++
		# Ga verder met de volgende iteratie
    continue
  }
	# Controleert of $i gelijk is aan 8
  if($i -eq 8)
  {
		# Als ja, breek de While-lus af en ga verder met de rest van het script
    break
  }
	# Print de huidige waarde van $i
  Write-Host "Processing item $i"
	# Verhoogt $1 met 1
  $i++
}

Zoals je kunt zien in de output hieronder, heeft de lus de vijfde en achtste items in de array overgeslagen. De while-lus heeft alle andere items in de array verwerkt en is na het bereiken van het achtste item beëindigd.

Executing a while loop with break and continue keywords

Het beperken van de tijd dat een While-lus wordt uitgevoerd

Meestal wil je misschien de hoeveelheid tijd beperken dat een lus wordt uitgevoerd. Misschien probeer je verbinding te maken met een externe server. In dat geval kun je de server de tijd geven om te reageren voordat je de lus afsluit door het Start-Sleep cmdlet te gebruiken binnen je while-lus.

De Start-Sleep cmdlet pauzeert de uitvoering van het script gedurende een opgegeven periode.

Voer de onderstaande code uit om de huidige datum en tijd te krijgen en op te slaan Get-Date in de variabele $startTime. De while-lus blijft draaien zolang de huidige datum/tijd minder is dan 10 seconden van de waarde die is opgeslagen in $startTime.

Tijdens het uitvoeren van de while-lus wordt een bericht afgedrukt terwijl de Start-Sleep cmdlet de uitvoering van het script pauzeert gedurende 1 seconde.

Het onderstaande codeblok is slechts een sjabloon voor wat je eigenlijk in de praktijk zou gebruiken. Je kunt meer code binnen de lus plaatsen zoals nodig.

# Ontvang en sla de huidige datum/tijd op
$startTime = Get-Date
# Stelt de While-lus in om te draaien terwijl de huidige datum/tijd minder is dan 10 seconden 
	# van de waarde opgeslagen in $startTime.
while((Get-Date) -lt ($startTime.AddSeconds(10)))
{
	# Drukt een bericht af
  Write-Host "Waiting for server to respond..."
	# Pauzeert het script voor één seconde
  Start-Sleep -Seconds 1
}

Hieronder zie je dat de lus is blijven draaien gedurende 10 seconden voordat deze de lus verlaat.

Limiting the time a while loop runs

Conclusie

PowerShell while-lussen komen van pas bij het omgaan met complexe concepten om vastlopen in een lus te voorkomen of terwijl je je scripts schrijft. En in deze tutorial heb je veel manieren geleerd om met while-lussen te werken voor flexibelere en krachtigere scripts.

Met deze nieuwe kennis is de sky the limit. Dus waarom niet het gebruik van logische operators en trefwoorden maximaliseren om taken te automatiseren met je scripts?

Source:
https://adamtheautomator.com/powershell-while-loop/