Loopar

PowerShell loops underlättar upprepande av samma kommandon med syfte att utföra konsekventa åtgärder under en viss tidsperiod. Det finns flera typer av loops tillgängliga i PowerShell samt villkorsstyrda uttryck som liknar loops men på ett annat sätt. På denna kursen kommer att användas några av följande loopar och villkorsstyrda uttryck:

  • if else
  • switch
  • for
  • foreach
  • while
  • do while
  • do until

Villkorsstyrda uttryck

Villkorsstyrda uttryck ger ett visst resultat beroende på uppställda villkor. Om villkoren uppfylls utförs ett visst kommando eller en grupp av kommando. Det innebär att kommandoutförandes flödet styrs med villkor i script. Två villkorsstyrda uttryck tas upp här, if och switch.

If else

If-satsen tillåter oss att evaluera ett uttryck i vilket ingår ett villkor och om det uppfylls utförs satsen (kommandon). Exempelvis:

PS C:\> $tal = 1
PS C:\> $tal
1
PS C:\> if ($tal -eq 1) {”$tal är lika med 1”}
1 är lika med 1

  • variabeln $tal skapas och tilldelas värdet 1
  • variabelns värde jämförs med talet 1
  • om variabelns värde är lika med 1 (villkor)
  • skickas till skärmen texten 1 är lika med 1. (resultat)

Fler exempel:

För att jämföra om ett uttryck är mindre än ett numeriskt värde exekvera:
PS C:\>if($Tal –lt 5) { ”Talet $Tal är mindre än 5” }
Talet 1 är mindre än 5
För att jämföra flera villkor i en if-sats kan vi använda oss av logiska operatörer.
PS C:\>$Tal = 9
PS C:\>if($Tal -lt 8 -OR $Tal -eq 9) { ”Talet $Tal är mindre än 8 eller lika med 9″}
Talet 9 är mindre än 8 eller lika med 9
För att styra vad som skall hända när ett villkor inte möts exekvera:
PS C:\>$nio = 9
PS C:\>if ($nio –lt 8) { ”Talet $nio är mindre än 8”} else {”Talet $nio är större än 8”}
Talet 9 är större än 8
Observera att första villkoret (9 < 8)möts inte men det gör den andra (9 > 8).

if, else, elseif

Utöver if och else kan vi använda elseif för att formulera flera villkor i en följd. Till exempel:

PS C:\>$Month = (Get-Date).Month
PS C:\>if (1,2,3,11,12 -like $Month) {”Vinter”} elseif (4,5 -like $Month) {”Vår”} elseif (6,7,8 -like $Month) {”Sommar”} else {”Höst”}

  • den aktuella månaden hämtas med Get-Date och lagras i variabeln $Month
  • månaden jämförs i if-satsen:
    • om den aktuella månaden är 1, 2, 3, 11 och 12
    • returneras Vinter
    • annars om den aktuella månaden är 4 eller 5 returneras Vår
    • om den aktuella månaden är 6, 7, eller 8
    • returneras Sommar
    • annars returneras Höst.

Observera att  if och elseif har en villkorssats mellan parenteser. Else har ingen villkorssats.

För att skicka en string till skärmen beroende av jämförelse mellan 10 och 5 exekvera
PS C:\>if (10 -gt 5) {Write-Host ”Yes”}
För att skicka en string till skärmen beroende av flera jämförelse mellan 10 och 5 exekvera
PS C:\>if (10 –gt 11) {Write-Host ”Yes”} elseif (11 –gt 10) {Write-Host ”This time, yes”}

Switch

Switch-satsen används för att utföra en operation baserat på ett specifikt värde. Till skillnad från if-satsen ger switch-satsen större flexibilitet, mindre kod och låter oss jämföra uttrycket med en serie av villkor. Om uttrycket matchar ett villkor utförs operationen associerad med villkoret.

För att jämföra en variabels värde med olika tal exekvera:
PS C:\>$a = 2
PS C:\>switch ($a) {1 {”$a är 1”} 2 {”$a är 2”} 3 {”$a är 3”} 4 {”$a är 4”}}
2 är 2
Den andra villkoret gäller men ändå fortsätter switch att jämföra med alla villkor
För att verifiera att switch använder alla villkor exekvera:
PS C:\>switch ($a) {1 {”$a är 1”}2{”$a är 2”}3{”$a är 3”}4{”$a är 4”}2{”$a är verkligen 2”}}
2 är 2
2 är verkligen 2

Switch – default

Switch-satsen har även stöd för standardvärden (default). Standardvärdet (default) används om villkoret inte uppfylls.

Denna gång ingen match och då gäller default
PS C:\>switch (1) {3 {”$a är 3”} 4 {”$a är 4”} 5 {”$a är 5”} Default { ”Talet matchar inte 3, 4 eller 5” }}
Talet matchar inte 3, 4 eller 5
Read-Host hämtar indata som användare anger (5) och därefter switch utför jämförelser:
PS C:\>switch (Read-Host ”Select 1, 2 or 3″) {1 {”Talet är ett”} 2 {”Talet är 2″} 3 {”Talet är 3″} Default { ”Talet matchar inte ett, två eller tre.” }}
Select 1, 2 or 3:
5
Talet matchar inte ett, två eller tre.

Switch – Wildcard

Switch-satsen har även stöd för wildcards och reguljära uttryck. För att använda wildcards vid matchning kan vi utnyttja parametern wildcard.

För att skapa variabeln $ps = ”Windows PowerShell” exekvera:
PS C:\>$ps = ”Windows PowerShell”
För att jämför variabelns värde med två villkor exekvera:
PS C:\>switch –WildCard ($ps) {”*PowerShell” {”Innehåller PowerShell”} ”W* [p]*” {”Börjar på W och innehåller p”}}
Innehåller PowerShell
Börjar på W och innehåller p

Variabeln $_

En speciell variabel som kan används för att jämföra olika värde.

För att skapa en variabel och tilldela den ett värde exekvera
PS C:\>$ps = ”Windows PowerShell”
Text
PS C:\>switch ($ps) {{ $_  -like ”*PowerShell” } { ”Innehåller PowerShell och Wildcard”}{ $_ -eq ”Windows PowerShell” } { ”Exakt matchning” }}
Innehåller PowerShell och Wildcard
Exakt matchning

FOR loop

For-loopen används för att exekvera kommando upprepade gånger så länge som det definierat villkoret möts. For loop består av tre delar, initiering, villkor, upprepade handling.

for (initiering;villkor;upprepade handling) {kommando exekvering}

För att kicka till skärmen variabelns värde så länge villkoret uppfylls exekvera:
PS C:\>for ($i = 0; $i -le 5; $i ++) { $i }
0
1
2
3
4
5
  • 0 ≤ 5, skickas $i = 0 till skärmen och därefter ökas variabelns värde med 1
  • 1 ≤ 5, skickas $i = 1 till skärmen och därefter ökas variabelns värde med 1
  • 2 ≤ 5, skickas $i = 2 till skärmen och därefter ökas variabelns värde med 1
  • 3 ≤ 5, skickas $i = 3 till skärmen och därefter ökas variabelns värde med 1
  • 4 ≤ 5, skickas $i = 4 till skärmen och därefter ökas variabelns värde med 1
  • 5 ≤ 5, skickas $i = 5 till skärmen och därefter ökas variabelns värde med 1
  • 6 ≤ 5, nu är det stopp.
Samma loop men denna gång istället med mindre än (-lt)
PS C:\>for ($i = 0; $i -lt 5; $i ++) { $i }
0
1
2
3
4
  • 0 < 5, skickas $i = 0 till skärmen och därefter ökas variabelns värde med 1
  • 1 < 5, skickas $i = 1 till skärmen och därefter ökas variabelns värde med 1
  • 2 ≤ 5, skickas $i = 2 till skärmen och därefter ökas variabelns värde med 1
  • 3 < 5, skickas $i = 3 till skärmen och därefter ökas variabelns värde med 1
  • 4 < 5, skickas $i = 4 till skärmen och därefter ökas variabelns värde med 1
  • 5 < 5, nu är det stopp.
För att skicka till skärmen variabelns värde så länge villkoret uppfylls exekvera:
PS C:\>for ($i = 10; $i -ge 5; $i – -) { $i }
10
9
8
7
6
5
  • 10 ≥ 5, skickas $i = 10 till skärmen och därefter minskas variabelns värde med 1
  • 9 ≥ 5, skickas $i = 9 till skärmen och därefter minskas variabelns värde med 1
  • 8 ≥ 5, skickas $i = 8 till skärmen och därefter minskas variabelns värde med 1
  • 7 ≥ 5, skickas $i = 7 till skärmen och därefter minskas variabelns värde med 1
  • 6 ≥ 5, skickas $i = 6 till skärmen och därefter minskas variabelns värde med 1
  • 5 ≥ 5, skickas $i = 5 till skärmen och därefter minskas variabelns värde med 1
  • 4 ≥ 5, nu är det stopp.

Foreach

En array kan innehålla flera värde som kan hämtas ett i taget med hjälp av foreach.

För att lagra alla aktiva processer i en variabel exekvera:
PS C:\>$processing = Get-Process
För att skicka endast namn till aktiva processer exekvera:
PS C:\>Foreach ($box in $processing){Write-Host $box.Name}
För att lagra igen aktiva processer i en variabel exekvera:
PS C:\>$processing = Get-Process
För att definiera variabeln $i och tilldela värdet 1 exekvera:
PS C:\>$i = 1
För att skicka till skärmen endast processens namn i en stigande ordning exekvera:
PS C:\>foreach ($box in $processing) {Write-Host ”Processen [$i] har för namn: $($box.Name)”;$i++}

While

While-loopen exekverar ett kommando så länge som ett givet villkor uppfylls. PowerShell evaluerar värdet som ges och returnerar antingen sant eller falskt.

För att definiera variabeln $i och tilldela värdet 0 exekvera:
PS C:\>$i = 0
För att skicka till skärmen en sträng upprepade gånger så länge villkoret uppfylls exekvera:
PS C:\>PS C:\>while ($i  -ne  4) {$i++; ”Värdet är = $i”}
Värdet är = 1
Värdet är = 2
Värdet är = 3
Värdet är = 4
  • 0 är inte lika med 4, utförs 0 + 1, skickas Värdet är = 1 till skärmen
  • 1 är inte lika med 4, utförs 1 + 1, skickas Värdet är = 2 till skärmen
  • 2 är inte lika med 4, utförs 2 + 1, skickas Värdet är = 3 till skärmen
  • 3 är inte lika med 4, utförs 3 + 1, skickas Värdet är = 4 till skärmen
  • 4 är inte lika med 4, nu är det stopp
För att visa på skärmen talen 0 till 9 exekvera:
PS C:\>$tal = 0
PS C:\>while ($tal -lt 10){Write-Host $tal;$tal++}

Do While

En variant på while-loopen är do while. Skillnaden är att do while alltid exekveras minst än gång eftersom kontrollen av villkoret (while) görs efter att operationen (do) har utförts.

För att öka variabelns värde med 1, skicka det aktuella värdet till skärmen så länge villkoret uppfylls exekvera:
PS C:\>$i=0; do { $i++; ”Värdet är = $i” } while ($i -ne 4)
Värdet är = 1
Värdet är = 2
Värdet är = 3
Värdet är = 4
  • $i = 0 +1, skickas till skärmen Värdet är = 1, 1 är inte lika med 4
  • $i = 1 +1, skickas till skärmen Värdet är = 2, 2 är inte lika med 4
  • $i = 2 +1, skickas till skärmen Värdet är = 3, 3 är inte lika med 4
  • $i = 3 +1, skickas till skärmen Värdet är = 4, 4 är inte lika med 4 Stopp
För att vissa på skärmen talen 0 till 9 exekvera:
PS C:\>$tal = 0
PS C:\>do {Write-Host $tal;$tal++} while ( ($tal -lt 10)
För att addera 7 till variabeln $i upprepade gånger tills villkoret uppfylls exekvera:
PS C:\>$i = 7; Do {$i; $i +=7} while ($i -le 35)
7
14
21
28
35

Do Until

Do kan även kombineras med until. Skillnaden från DO WHILE är att DO UNTIL använder operatören -ge (större eller lika med), medan DO WHILE använder operatören -le (mindre eller lika med).

Operationen utförs så länge värdet inte är större än eller lika med fyra.
PS C:\>$i=0; do { $i++; ”Värdet är = $i” } until ($i -ge 4)
Värdet är = 1
Värdet är = 2
Värdet är = 3
Värdet är = 4