about_Break
Kort beskrivning
Beskriver -instruktionen break
, som ger ett sätt att avsluta det aktuella kontrollblocket.
Lång beskrivning
Instruktionen break
är ett sätt att avsluta det aktuella kontrollblocket.
Körningen fortsätter vid nästa instruktion efter kontrollblocket. -instruktionen stöder etiketter. En etikett är ett namn som du tilldelar till en -instruktion i ett skript.
Använda break
i loopar
När en break
-instruktion visas i en loop, till exempel en foreach
, for
, do
eller while
-loop, avslutar PowerShell omedelbart loopen.
En break
-instruktion kan innehålla en etikett som gör att du kan avsluta inbäddade loopar. En etikett kan ange valfritt loopnyckelord, till exempel foreach
, for
eller while
, i ett skript.
I följande exempel visas hur du använder en break
-instruktion för att avsluta en for
-instruktion:
for($i=1; $i -le 10; $i++) {
Write-Host $i
break
}
I det här exemplet avslutar -instruktionen break
loopen for
när variabeln $i
är lika med 1. Även om -instruktionen for
utvärderas till Sant tills $i
är större än 10, når PowerShell break-instruktionen första gången loopen for
körs.
Det är vanligare att använda -instruktionen break
i en -loop där ett inre villkor måste uppfyllas. Tänk dig följande foreach
instruktionsexempel:
$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"
I det här exemplet itererar -instruktionen foreach
matrisen $varB
. -instruktionen if
utvärderas till False de första två gångerna loopen körs och variabeln $i
ökas med 1. Den tredje gången loopen körs är $i
lika med 2 och variabeln $val
är lika med 30. Nu körs -instruktionen break
och loopen foreach
avslutas.
Använda en etikett som är märkt break
i en loop
En break
-instruktion kan innehålla en etikett. Om du använder nyckelordet break
med en etikett avslutar PowerShell den märkta loopen i stället för att avsluta den aktuella loopen.
Etiketten är ett kolon följt av ett namn som du tilldelar. Etiketten måste vara den första token i en -instruktion och den måste följas av nyckelordet loopning, till exempel while
.
break
flyttar körningen från den märkta loopen. I inbäddade loopar har detta ett annat resultat än nyckelordet break
har när det används av sig självt. Det här exemplet har en while
-instruktion med en for
-instruktion:
: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
Om villkor 2 utvärderas till Sant hoppar körningen av skriptet ned till -instruktionen efter den märkta loopen. I exemplet börjar körningen igen med -instruktionen $a = $c
.
Du kan kapsla många etiketterade loopar, som du ser i följande exempel.
: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"
Om variabeln $b
utvärderas till True återupptas körningen av skriptet efter loopen som är märkt "röd". Om variabeln $c
utvärderas till True återupptas körningen av skriptkontrollen efter loopen som är märkt "gul".
Om variabeln utvärderas till True återupptas körningen $a
efter den innersta loopen. Ingen etikett behövs.
PowerShell begränsar inte hur långt etiketter kan återuppta körningen. Etiketten kan till och med skicka kontroll över skript- och funktionsanropsgränser.
Använda break
i en switch
-instruktion
I en switch
konstruktion break
gör det att PowerShell avslutar kodblocket switch
.
Nyckelordet break
används för att lämna -konstruktionen switch
. Följande instruktion använder break
till exempel switch
-instruktioner för att testa för det mest specifika villkoret:
$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
}
}
I det här exemplet skapas och initieras variabeln $var
till strängvärdet word2
. - switch
instruktionen använder Regex-klassen för att matcha variabelvärdet först med termen word2
. Eftersom variabelvärdet och det första testet i instruktionen switch
matchar körs det första kodblocket i -instruktionen switch
.
När PowerShell når den första break
instruktionen avslutas -instruktionen switch
. Om de fyra break
uttrycken tas bort från exemplet uppfylls alla fyra villkoren. I det här exemplet används -instruktionen break
för att visa resultat när det mest specifika villkoret uppfylls.
Använda break
i en trap
-instruktion
Om den slutliga instruktionen som körs i brödtexten i en trap
-instruktion är break
, ignoreras felobjektet och undantaget genereras igen.
I följande exempel skapas ett DivideByZeroException-undantag som fångas med hjälp av -instruktionen trap
.
function test {
trap [DivideByZeroException] {
Write-Host 'divide by zero trapped'
break
}
$i = 3
'Before loop'
while ($true) {
"1 / $i = " + (1 / $i--)
}
'After loop'
}
test
Observera att körningen stoppas vid undantaget. After loop
nås aldrig.
Undantaget genereras igen efter körningen trap
.
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.
Använd inte break
utanför en loop, switch
, eller trap
När break
används utanför en konstruktion som har direkt stöd för den (loopar, switch
, trap
) letar PowerShell upp anropsstacken för en omslutande konstruktion. Om det inte går att hitta en omslutande konstruktion avslutas det aktuella körningsutrymmet tyst.
Det innebär att funktioner och skript som oavsiktligt använder en break
utanför en omslutande konstruktion som stöder den oavsiktligt kan avsluta sina anropare.
Om du använder break
inuti en pipeline break
, till exempel ett ForEach-Object
skriptblock, avslutas inte bara pipelinen, utan kan potentiellt avsluta hela körningsutrymmet.