Előfordulhat, hogy a ciklusunkat nem szeretnénk minden körülmények között végig futtatni minden elemre. Ha teljesen ki akarunk lépni, akkor a Break kulcsszót használjuk, ha csak az adott elemen akarunk továbblépni, akkor a Continue kulcsszó használható. Nézzünk erre példákat:
[4] PS C:\> $tömb= 1,2,"szöveg",3
[5] PS C:\> for($i=0; $i -lt $tömb.length;$i++){if($tömb[$i] -is [int]){$tömb[$i]*2}else{continue};" ez most a $i. elem duplája volt"}
2
ez most a 0. elem duplája volt
4
ez most a 1. elem duplája volt
6
ez most a 3. elem duplája volt
A fenti példában van egy vegyes elemű $tömb-öm. Én az egész számokat tartalmazó elemekre szeretnék a szám dupláját kiírni és kikerülni a nem egész számokat. Látszik, hogy az IF-nek az ELSE ágán a continue után már nem hajtódik végre a szöveg kiírása.
Nézzünk egy másik példát, ahol nem átugrunk cikluselemet, hanem teljesen kiugrunk a ciklusból mihelyst oda nem illő elemet találunk:
[25] PS C:\> $tömb= 1,2,"szöveg",3
[34] PS C:\> foreach($elem in $tömb){if($elem -isnot [int]){"Hiba!!!!: $elem"; break}; $elem}
1
2
Hiba!!!!: szöveg
Mi van akkor, ha nem egy, hanem két ciklusunk van egymásba ágyazva, és ekkor akarok kiugrani a ciklusokból? Honnan tudja a PowerShell, hogy melyik ciklusból akartam kiugrani, csak a belsőből, vagy mindkét rétegből? Ennek tisztázására használhatunk címkéket, amelyek megmondják a break utasításnak, hogy hova ugorjon ki:
[38] PS C:\> for($i=0; $i -lt 3;$i++)
>> {
>> for($j=5; $j -lt 8;$j++)
>> {
>> "i:{0} j:{1}" -f $i, $j
>> if($j -eq 6){break}
>> }
>> }
>>
i:0 j:5
i:0 j:6
i:1 j:5
i:1 j:6
i:2 j:5
i:2 j:6
A fenti példában látszik, hogy amikor a $j eléri a 6-os értéket és lefut a break, akkor csak a belső ciklusból léptem ki, megjelenik az $i=1 és $i=2 érték is, azaz a külső ciklusból nem lépett ki. Hogyan tudok mindkét ciklusból egyszerre kilépni? Használjunk címkét:
[40] PS C:\> :külső for($i=0; $i -lt 3;$i++)
>> {
>> for($j=5; $j -lt 8;$j++)
>> {
>> "i:{0} j:{1}" -f $i, $j
>> if($j -eq 6){break külső}
>> }
>> }
>>
i:0 j:5
i:0 j:6
Látszik, hogy a $j=6 első előfordulásánál kilépett mindkét ciklusból.
A címkéket tehát mindig a ciklust képző kifejezés elejére kell tenni, ahonnan ki akarok lépni. A címkéket a PowerShell bentről kifelé keresi, azaz ha ugyanolyan címkéből több is van, akkor a legmélyebben található címkéből lép ki csak:
[24] PS C:\> :címke do
>> {
>> :címke do
>> {
>> break címke
>> }while($false)
>> "belső"
>> }while($false)
>> "külső"
>>
belső
külső
A fenti példából látható, hogy a belső DO ciklusból léptem csak ki a BREAK kifejezéssel, hiszen a kimeneten megjelent a „belső” kimenet is. Ha a külsőből lépett volna ki, akkor csak a „külső” feliratot láthattuk volna.
A címkék globálisak, azaz ha én egy szkriptet hívok egy ciklusban, és a szkriptben van hivatkozás egy külső címkére, akkor is kilép. Nézzük a szkriptet:
while($true)
{
"Bent vagyok"
Break
messze
}
És az ezt meghívó interaktív kifejezést, valamint a kimenetet:
PS C:\Users\tibi> :messze while($true){C:\_munka\powershell2\v2\munka\globalbre
ak.ps1}
Bent vagyok
Látható, hogy mindkét ciklus végtelen lenne, de ott van a BREAK, ráadásul kívülre mutat, így mindkét ciklusból kilépett.
Megjegyzés:
Még trükkösebb lehetőség, hogy a break attribútuma nem csak statikus szöveg lehet, hanem ez a címke egy változóból is jöhet. Azaz bizonyos helyzetekben, mondjuk, az egyik címkéhez ugrunk vissza, más esetekben egy másik címkéhez, és ehhez csak a változónk tartalmát kell változtatni.