about_Break
Kort beskrivning
Beskriver -instruktionen break
, som ger ett sätt att avsluta det aktuella kontrollblocket.
Lång beskrivning
Instruktionen break
ger 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 True tills $i
den ä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 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. I det här exemplet finns 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 $a
utvärderas till True återupptas körningen 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 ett strängvärde på word2
. Instruktionen switch
använder Klassen Regex 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 skapar du 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. Den 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
Attempted to divide by zero.
At line:10 char:6
+ "1 / $i = " + (1 / $i--)
+ ~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : RuntimeException
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
), söker PowerShell upp anropsstacken för en omslutande konstruktion. Om den inte hittar en omslutande konstruktion avslutas den aktuella körningsytan 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
i en pipeline break
, till exempel ett ForEach-Object
skriptblock, avslutas inte bara pipelinen, utan kan potentiellt avsluta hela körningsytan.