about_Break
Rövid leírás
Az utasítást break
ismerteti, amely lehetővé teszi az aktuális vezérlőblokkból való kilépést.
Hosszú leírás
Az break
utasítással kiléphet az aktuális vezérlőblokkból.
A végrehajtás a következő utasításnál folytatódik a vezérlőblokk után. Az utasítás támogatja a címkéket. A címke egy szkriptben lévő utasításhoz hozzárendelt név.
Ciklusok használata break
Amikor egy break
utasítás megjelenik egy hurokban, például egy foreach
, for
, do
vagy while
hurokban, a PowerShell azonnal kilép a ciklusból.
Az break
utasítások tartalmazhatnak olyan címkét, amely lehetővé teszi a beágyazott hurkokból való kilépést. A címkék bármilyen ciklus kulcsszót megadhatnak, például foreach
egy szkriptben, for
vagy while
egy szkriptben.
Az alábbi példa bemutatja, hogyan lehet utasítással break
kilépni egy utasításból for
:
for($i=1; $i -le 10; $i++) {
Write-Host $i
break
}
Ebben a példában az break
utasítás kilép a for
ciklusból, amikor a $i
változó értéke 1. Annak ellenére, hogy az for
utasítás értéke True (Igaz) lesz, amíg $i
10-nél nagyobb nem lesz, a PowerShell a ciklus első futtatásakor eléri a for
törési utasítást.
Gyakrabban használják az break
utasítást olyan hurokban, amelyben egy belső feltételnek teljesülnie kell. Vegyük példaként a következő foreach
utasítást:
$i=0
$varB = 10,20,30,40
foreach ($val in $varB) {
if ($val -eq 30) {
break
}
$i++
}
Write-Host "30 was found in array index $i"
Ebben a példában az foreach
utasítás iterálja a $varB
tömböt. Az if
utasítás a ciklus első két futtatásakor hamis értéket ad vissza, a változó $i
pedig 1-zel növekszik. A ciklus harmadik futtatása $i
2, a $val
változó pedig 30. Ezen a ponton az break
utasítás fut, és a foreach
hurok kilép.
Ciklusban címkézett break
címke használata
Az break
utasítások tartalmazhatnak címkét. Ha a break
kulcsszót címkével használja, a PowerShell az aktuális ciklusból való kilépés helyett kilép a címkézett ciklusból.
A címke egy kettőspont, amelyet egy hozzárendelt név követ. A címkének egy utasítás első tokenjének kell lennie, amelyet a ciklus kulcsszónak kell követnie, például while
.
break
áthelyezi a végrehajtást a címkézett hurokból. A beágyazott hurkokban ennek más az eredménye, mint a break
kulcsszónak, amikor önmagában használja. Ez a példa egy while
utasítással rendelkező utasítással for
rendelkezik:
:myLabel while (<condition 1>) {
for ($item in $items) {
if (<condition 2>) {
break myLabel
}
$item = $x # A statement inside the For-loop
}
}
$a = $c # A statement after the labeled While-loop
Ha a 2 . feltétel értéke Igaz, a szkript végrehajtása a címkézett hurok után az utasításra ugrik. A példában a végrehajtás az utasítással $a = $c
kezdődik újra.
A következő példában látható módon számos címkézett hurkot ágyazhat be.
:red while (<condition1>) {
:yellow while (<condition2>) {
while (<condition3>) {
if ($a) {break}
if ($b) {break red}
if ($c) {break yellow}
}
Write-Host "After innermost loop"
}
Write-Host "After yellow loop"
}
Write-Host "After red loop"
Ha a $b
változó értéke Igaz, a szkript végrehajtása a "piros" címkével ellátott ciklus után folytatódik. Ha a $c
változó értéke Igaz, a szkriptvezérlő végrehajtása a "sárga" címkével ellátott ciklus után folytatódik.
Ha a $a
változó értéke Igaz, a végrehajtás a legbelső hurok után folytatódik. Nincs szükség címkére.
A PowerShell nem korlátozza, hogy a címkék milyen mértékben folytathatják a végrehajtást. A címke még a szkriptek és függvényhívások határán is át tudja adni a vezérlést.
Használat break
utasításban switch
switch
Egy szerkezetben a break
PowerShell kilép a switch
kódblokkból.
A break
kulcsszó a szerkezet elhagyására switch
szolgál. A következő switch
utasítás például utasítások használatával break
teszteli a legspecifikusabb feltételt:
$var = "word2"
switch -regex ($var) {
"word2" {
Write-Host "Exact" $_
break
}
"word.*" {
Write-Host "Match on the prefix" $_
break
}
"w.*" {
Write-Host "Match on at least the first letter" $_
break
}
default {
Write-Host "No match" $_
break
}
}
Ebben a példában a $var
változó létrejön és inicializálódik egy sztringértékre word2
. Az switch
utasítás a Regex osztályt használja a változó értékének először a kifejezéssel word2
való egyeztetéséhez. Mivel a változó értéke és az switch
utasítás első tesztje egyezik, az utasítás első kódblokkja switch
fut.
Amikor a PowerShell eléri az első break
utasítást, az switch
utasítás kilép. Ha a négy break
utasítás el lesz távolítva a példából, mind a négy feltétel teljesül. Ez a példa az utasítást használja az break
eredmények megjelenítésére, ha a legspecifikusabb feltétel teljesül.
Használat break
utasításban trap
Ha az utasítás törzsében trap
végrehajtott végső utasítás az break
, a hibaobjektum el lesz tiltva, és a kivétel újra lesz vetve.
Az alábbi példa egy DivideByZeroException kivételt hoz létre, amely az trap
utasítás használatával csapdába esik.
function test {
trap [DivideByZeroException] {
Write-Host 'divide by zero trapped'
break
}
$i = 3
'Before loop'
while ($true) {
"1 / $i = " + (1 / $i--)
}
'After loop'
}
test
Figyelje meg, hogy a végrehajtás a kivételnél leáll. Soha After loop
nem érik el.
A kivétel újra lesz vetve a trap
végrehajtás után.
Before loop
1 / 3 = 0.333333333333333
1 / 2 = 0.5
1 / 1 = 1
divide by zero trapped
ParentContainsErrorRecordException:
Line |
10 | "1 / $i = " + (1 / $i--)
| ~~~~~~~~~~~~~~~~~~~~~~~~
| Attempted to divide by zero.
Ne használjon break
hurkon kívül, switch
vagy trap
Ha break
olyan szerkezeten kívül használják, amely közvetlenül támogatja azt (hurkok, switch
), trap
a PowerShell megkeresi a hívásvermet egy belefoglaló szerkezethez. Ha nem talál belefoglaló szerkezetet, az aktuális futtatótér csendesen leáll.
Ez azt jelenti, hogy azok a függvények és szkriptek, amelyek véletlenül egy break
külső szerkezetet használnak, amely támogatja azt, véletlenül leállíthatják a hívóikat.
Ha break
egy folyamaton break
( például egy ForEach-Object
szkriptblokkon) belül használja, nem csak kilép a folyamatból, hanem a teljes futtatókörnyezetet is leállítja.