Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Kort beskrivning
Beskriver break-instruktionen, som ger ett sätt att avsluta det aktuella kontrollblocket.
Lång beskrivning
Med break-instruktionen kan du avsluta det aktuella kontrollblocket.
Körningen fortsätter vid nästa instruktion efter kontrollblocket. Uttalandet 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, doeller 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, foreller 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 break-instruktionen for-loopen när variabeln $i är lika med 1. Även om for-instruktionen utvärderas till True tills $i är större än 10, når PowerShell break-instruktionen första gången for-loopen körs.
Det är vanligare att använda break-instruktionen i en loop där ett inre villkor måste uppfyllas. Överväg 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 foreach-instruktionen $varB matrisen. 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 break-instruktionen och foreach-loopen avslutas.
Använda en 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 det break nyckelordet 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 Truehoppar 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 switchkonstruktion gör break att PowerShell avslutar switch kodblocket.
Nyckelordet break används för att lämna switch-konstruktionen. Följande switch-instruktion använder till exempel break-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.
switch-instruktionen använder klassen Regex för att matcha variabelvärdet först med termen word2. Eftersom variabelvärdet och det första testet i switch-instruktionen matchar körs det första kodblocket i switch-instruktionen.
När PowerShell når den första break-instruktionen avslutas switch-instruktionen. Om de fyra break-uttrycken tas bort från exemplet uppfylls alla fyra villkoren. I det här exemplet används break-instruktionen 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 breakignoreras felobjektet och undantaget genereras igen.
I följande exempel skapar du ett DivideByZeroException undantag som fångas med hjälp av trap-instruktionen.
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 när trap körs.
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, switcheller trap
När break används utanför en konstruktion som direkt stöder den (loopar, switch, trap), söker PowerShell upp i anropsstacken efter en omslutande konstruktion. Om den inte hittar en omslutande konstruktion, avslutas det nuvarande körutrymmet 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, inte bara avslutar pipelinen, kan hela körningsytan avslutas.