Címkék, törés (Break), folytatás (Continue)

Előfordulhat, hogy a ciklusunkat nem szeretnénk minden körülmények között végigfuttatni 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 kiugorni, 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.



Word To HTML Converter