Om controle te krijgen binnen een script kun je gebruikmaken van zogenaamde 'control structures. Hieronder volgen de meest gebruikte.
Aan de hand van onderstaand voorbeeld bekijken we wat deze structuur doet.
Clear-Host
[int] $number = Read-Host "Vul een getal tussen 1 en 10 in"
if ($number -gt 10) {
write-host "Het getal is groter dan 10"}
elseif ($number -lt 10) {
write-Host "Het getal is kleiner dan 10"}
else {
Write-Host "Het getal is precies 10"}
Regel 1 Het scherm wordt leeg gemaakt voordat de code wordt uitgevoerd.
Regel 2 [int]
declareert de variabele number
als een geheel getal.Vervolgens wordt met het commando Read-Host de input ge vraagd van een gebruiker.
Regel 3, 6, 9 Hier volgt de if-, elseif- en else-constructie, waardoor er drie mogelijkheden worden gecreëerd.
Regel 3-5 De inhoud van de variabele number
wordt vergeleken of deze groter (-gt = greater than) is dan 10. Als dat het geval is wordt het deel dat tussen de accolades ({}) staat uitgevoerd, na melijk er wordt naar het scherm geschreven (write-Host
).
Regel 6-8 Als de eerste controle, de eerste if
niet waar is wordt de elseif
geprobeerd. Wederom wordt de waarde van de variabele gecontroleerd. In dit geval of deze minder (-1t = less than) is dan 10. Indien de controle klopt wordt ook hier de code tussen de accolades uitgevoerd.
Regel 9-11 Als beide controles, de if
en de elseif
, niet waar zijn wordt de else
uitgevoerd. In dit geval: als de waarde van de variabele number niet kleiner en niet groter is dan 10 moet deze zelf de waarde 10 hebben. De code tussen de accolades wordt uitgevoerd en de tekst wordt op het beeldscherm weergegeven.
TIP PowerShell snapt welke regels bij elkaar horen en laat dat zien met behulp van een verticale lijn ervoor. Door op de in het vakje te klikken, 'klapt' de code in en wijzigt de - in een +.
Het volgende is belangrijk te onthouden:
elseif
worden gebruikt.if
-vergelijking waar is, worden de elseif
en de else niet meer geëvalueerd.help about-if
Bestudeer eens onderstaand voorbeeld en lees dan de toelichting.
Clear-Host
[array]$number = @(1,2,3,4,5,6,7,8,9,10)
Foreach ($a in $number)
{
Write-Host $a
}
Regel 1 Het scherm wordt leeg gemaakt voordat de code wordt uitgevoerd.
Regel 2 De variabele number
wordt gevuld met een array (verza meling) aan getallen. Om aan te geven dat het om een array gaat staat er een @ teken voor. Eerder in dit boek heb je gezien dat een reeks getallen ook makkelijker gemaakt kan worden:
[array] $number = @(1..10)
.
Regel 3-6 Elke waarde in de array wordt stuk voor stuk in de variabele a
gestopt en op het beeldscherm getoond (Write-Host
). Net zolang totdat alle waarden in de array 'gebruikt' zijn. Ook hier wordt de uit te voeren code tussen accolades geplaatst.
Switch is een prima constructie waarin veel controles zitten zonder de constructies if, elseif of else te gebruiken. Zie onderstaand voor beeld voor de syntax.
Clear-Host.
$number = Read-Host "Vul een getal in tussen 0 en 4"
Switch ($number)
{
1 {Write-Host "Je hebt het getal 1 gekozen"}
2 {Write-Host "Je hebt het getal 2 gekozen"}
3 {Write-Host "Je hebt het getal 3 gekozen"}
Default {Write-Host "Je hebt niet het getal 1,2 of 3 gekozen"}
}
Regel 1 Het scherm wordt leeg gemaakt voordat de code wordt uitgevoerd (Clear-Host
)
Regel 2 De variabele number
wordt gevuld door de gebruiker om in put te vragen.
Regel 3 De Switch-constructie wordt gestart en de waarde van de variabele wordt in de constructie geplaatst. De gehele code daar na wordt tussen accolades geplaatst.
Regel 5-9 Elke switch wordt getoetst. Indien de waarde van de va riabele overeenkomt met de switch, wordt de code daarna (ook. weer tussen accolades) uitgevoerd. Vervolgens gaat de constructie verder en wordt er gekeken of er nog meer matches zijn. Dit in tegenstelling tot de constructie If, ElseIf, Else
.
Belangrijk:
{Write-Host "Je hebt het getal 1 gekozen"; break}
Daarna wordt de switch-constructie verlaten.
Bij een switch-constructie zijn meerdere matches mogelijk, in tegen stelling tot de constructie If, ElseIf, Else
.
Er is een aantal constructies mogelijk om een loop te maken. We be spreken er één waarna er nog twee voorbeelden volgen.
Clear-Host
[int] $a = 0
Do
{
Write-Host "De waarde van $a is $a"
$a++
}
While ($a lt 10)
Regel 1 Het scherm wordt leeg gemaakt voordat de code wordt uit gevoerd.
Regel 2 De variabele a
krijgt de waarde 0 toegewezen.
Regel 3 De Do-loop start, de code erna staat tussen accolades.
Regel 5 De waarde van de variabele a
wordt naar het scherm geschreven. Het backtick-teken (`) zorgt dat niet de waarde, maar de variabele zelf wordt weergegeven.
Regel 6 De waarde van variabele a
wordt met 1 verhoogd ($a++
).
Regel 8 Zolang de waarde van variabele a
minder (-lt = less than) 10 is wordt de Do-loop uitgevoerd.
Een andere mogelijkheid:
Clear-Host
[int] $a = 0
Do
{
Write-Host "De waarde van `$a is $a"
$a++
}
Until ($a -gt 10)
Of:
Clear-Host
[int] $a = 0
While ($a lt 10)
{
Write-Host "De waarde van `$a is $a"
$a++
}
Als laatste de For-lus.
Clear-Host
For ([int] $a = 0; $a lt 10; $a++)
{
write-Host "De waarde van $a is $a"
}
Bij de For-lus worden alle condities achter elkaar opgegeven:
$a
= 0)$a -lt 10
)$a++
)Maak een PowerShell-script dat de leeftijd vraagt en daarna aangeeft of de gebruiker:
Met het script in opdracht 2 van het onderdeel Providers heb je 50 bestanden (txt files) aangemaakt in een folder met de naam data1. De bestanden hebben echter allemaal dezelfde datum waarop ze zijn gemaakt (creatiedatum). Voor deze opdracht heb je bestanden met verschillende creatiedata nodig. In bijlage A (aan het eind van het boek) bij opdracht 4.3 vind je een script waarmee je de 'creationtime' kunt wijzigen.
TIP Maak eerst een kopie van de folder voordat je werkelijk bestanden gaat verwijderen. Zodoende kun je makkelijker en vaker testen. Uiteraard kun je ook eerst gebruikmaken van de paramater -whatif
.
Breid je Powershell-script dusdanig uit dat lege mappen, die misschien ontstaan zijn, daarna verwijderd worden.