| | 0

PowerShell: Sprachkonstrukte (Do/While Schleife, Do/Until Schleife) – Part 17.4

4.4.5     Do/While Schleife

Die Do/While Schleife ist ebenfalls eine konditionale Schleife und verhält sich ähnlich wie die While Schleife.

Do

 { 

Do Schlüsselwort
 <StatementList>
}   
Anweisungsblock
While While Schlüsselwort
(   
<Pipeline>)
Pipeline zum Testen

Der Unterschied zwischen den beiden Schleifen besteht darin, dass bei der Do/While Schleife der Anweisungsblock einmal ausgeführt wird, bevor die Bedingung überprüft wird.

 

4.4.6    Do/Until Schleife

Die Do/Until Schleife ist eine Abwandlung der Do/While Schleife.

Do

 { 

Do Schlüsselwort
 <StatementList>
}   
Anweisungsblock
Until Until Schlüsselwort
(   
<Pipeline>)
Pipeline zum Testen

Der einzige Unterschied zu Do/While Schleife besteht darin, dass die Do/Until Schleife die Verarbeitung abbricht, wenn der Test der Pipeline den Wert $True ergibt.

 

4.4.7     Break, Continue und Labels

Das Schlüsselwort Break erlaubt es, eine Schleife an einer beliebigen Stelle zu verlassen und mit, sich hinter der Schleife befindlichen, Anweisungen fortzufahren. Das Schlüsselwort Continue erlaubt es, von einer beliebigen Stelle innerhalb einer Schleife zum Anfang der Schleife zu springen und den weiteren Iterationsschritt einzuleiten. Beides sind nicht strukturierte Methoden für die Manipulation einer Schleife, dennoch können sie sich in bestimmten Fällen als nützlich erweisen, damit ist die Flusssteuerung innerhalb des Codes noch ein Stück  flexibler.  Folgendes Beispiel illustriert die Verwendung von Continue und Break:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
1.  While ($True)
2.  >> {
3.  >>     $TestNumber = Get-Random -max 100000
4.  >>     if ($TestNumber -eq 2) {Write-Host "Prime: $TestNumber";Continue}
5.  >>     if ($TestNumber % 2 -eq 0) {Continue}
6.  >>     for ($i = 3;$i -lt $TestNumber;$i++)
7.  >>     {
8.  >>         if (($TestNumber % $i) -eq 0) {Break}
9.  >>     }
10. >>     If ($i -eq $TestNumber)
11. >>     { 
12. >>           Write-Host "Prime: $TestNumber"
13. >>     }
14. >> }
15. >>
Prime: 3163
Prime: 25033
Prime: 23279
Prime: 91529
Prime: 41177
Prime: 69593
Prime: 19273
Prime: 53089
Prime: 74177
Prime: 11731
Prime: 48187
Prime: 40361
Prime: 1019
Prime: 48157
Prime: 30869
Prime: 47339
Prime: 87853
...
13. Ctrl + C

In diesem Beispiel werden fortlaufend Zufallszahlen generiert (Zeile 3) und auf ihre Primeigenschaft hin untersucht. Wenn die Zahl in $TestNumber gleich zwei ist (Primzahl), wird sie direkt ausgegeben. Da weitere Überprüfungen bei zwei sinnlos sind, wird mit Continue ein weiterer Iterationsschritt eingeleitet. Ist die zufällig gewählte Zahl gerade (Zeile 5), wird hier ebenfalls mit Continue der nächste Iterationsschritt eingeleitet. In jedem anderen Fall beginnt die eigentliche Überprüfung auf die Primeigenschaft. Dazu wird versucht, den Wert in *$TestNumber fortlaufend durch natürliche Zahlen größer drei und kleiner $TestNumber  zu dividieren und zu schauen, ob das Ergebnis gleich Null ist. In diesem Fall hätte die untersuchte Zahl einen Teiler, der ungleich eins und der Zahl selbst und demnach keine Primzahl wäre. An dieser Stelle wird die For-Schleife ebenfalls mit Break verlassen und der nächste Iterationsschritt beginnt. Läuft die For-Schleife zu Ende, ist eine Primzahl gefunden worden.

Besteht die Notwendigkeit, zwei oder mehrere Schleifen zu verschachteln, gibt es die Möglichkeit, diese bei Bedarf gezielt zu verlassen. Dazu können die Schleifenschlüsselworte mit einem Label versehen werden. Bei der Verwendung von Break kann dann der Name der Sprungmarke angegeben werden, was dazu führt, dass nicht die aktuelle Schleife, sondern die benannte beendet wird. Folgende schematische Darstellung zeigt die Verwendung von Labels:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
:FirstLevel while ($True)
{
    :SecondLevel while ($True)
    {
        while ($True)
        {
            if ($a) {break}
            if ($b) {break FirstLevel}
            if ($c) {break SecondLevel}
        }
        Write-Host "After innermost loop"
    }
        Write-Host "After SecondLevel loop"
}
        Write-Host "After FirstLevel loop"

 

In der innersten While-Schleife wird der Wert der Variablen $a, $b und $c überprüft. Wenn $a = $True, wird die innerste Schleife verlassen und die Schleife mit dem Label „:SecondLevel“ läuft weiter. Wenn $b = $ True ist, wird die Schleife mit dem Label „:FirstLevel“ verlassen (also das gesamte Schleifenkonstrukt). Wenn schließlich $c = $True ist, wird der nächste Iterationsschritt der äußersten Schleife eingeleitet.

 

* Aus dem rein mathematischen Gesichtspunkt würde es reichen, in diesem Verfahren die For-Schleife lediglich bis zu √$TestNumber laufen zu lassen. Die Berechnung der Wurzel verlangsamt jedoch den Ablauf der Schleife erheblich im Vergleich zu mehr Iterationsschritten in der For-Schleife.