about_Break
Korte beschrijving
Beschrijft een -instructie die u kunt gebruiken om de instructies , for
, while
, do
, switch
of trap
onmiddellijk af te sluitenforeach
.
Lange beschrijving
De break
instructie biedt een manier om het huidige besturingsblok af te sluiten.
De uitvoering wordt voortgezet bij de volgende instructie na het besturingsblok. De instructie ondersteunt labels. Een label is een naam die u toewijst aan een instructie in een script.
In-lussen gebruiken break
Wanneer een break
instructie wordt weergegeven in een lus, zoals een foreach
lus , for
, do
of while
, wordt de lus door PowerShell onmiddellijk afgesloten.
Een break
instructie kan een label bevatten waarmee u ingesloten lussen kunt afsluiten. Een label kan elk lus trefwoord opgeven, zoals foreach
, for
of while
, in een script.
In het volgende voorbeeld ziet u hoe u een break
instructie gebruikt om een for
instructie af te sluiten:
for($i=1; $i -le 10; $i++) {
Write-Host $i
break
}
In dit voorbeeld wordt de break
-instructie afgesloten for
wanneer de $i
variabele gelijk is aan 1. Hoewel de for
instructie waar is totdat $i
groter is dan 10, bereikt PowerShell de onderbrekingsinstructie wanneer de lus voor het for
eerst wordt uitgevoerd.
Het is gebruikelijker om de break
instructie te gebruiken in een lus waarin aan een binnenste voorwaarde moet worden voldaan. Bekijk het volgende foreach
voorbeeld van de instructie:
$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"
In dit voorbeeld wordt de foreach
-instructie herhaald $varB
. De if
instructie resulteert in Onwaar de eerste twee keer dat de lus wordt uitgevoerd en de variabele $i
wordt verhoogd met 1. De derde keer dat de lus wordt uitgevoerd, $i
is gelijk aan 2 en de $val
variabele is gelijk aan 30. Op dit moment wordt de break
instructie uitgevoerd en wordt de foreach
lus afgesloten.
Een gelabeld break
in een lus gebruiken
Een break
instructie kan een label bevatten. Als u het break
trefwoord met een label gebruikt, sluit PowerShell de gelabelde lus af in plaats van de huidige lus af te sluiten.
Het label is een dubbele punt gevolgd door een naam die u toewijst. Het label moet het eerste token in een -instructie zijn en het moet worden gevolgd door het trefwoord herhalen, zoals while
.
break
verplaatst de uitvoering uit de gelabelde lus. In ingesloten lussen heeft dit een ander resultaat dan het break
trefwoord wanneer het zelf wordt gebruikt. Dit voorbeeld heeft een while
-instructie met een for
-instructie:
: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
Als voorwaarde 2 Waar oplevert, wordt de uitvoering van het script overgeslagen naar de instructie na de gelabelde lus. In het voorbeeld begint de uitvoering opnieuw met de instructie $a = $c
.
U kunt veel gelabelde lussen nesten, zoals wordt weergegeven in het volgende voorbeeld.
: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"
Als de $b
variabele Waar oplevert, wordt de uitvoering van het script hervat na de lus met het label 'rood'. Als de $c
variabele Waar oplevert, wordt de uitvoering van het scriptbeheer hervat na de lus met het label 'geel'.
Als de $a
variabele Waar oplevert, wordt de uitvoering hervat na de binnenste lus. Er is geen label nodig.
PowerShell beperkt niet hoe ver labels de uitvoering kunnen hervatten. Het label kan zelfs de besturing doorgeven over de grenzen van scripts en functie-aanroepen.
Gebruiken break
in een switch
-instructie
In een switch
constructie break
zorgt ervoor dat PowerShell het switch
codeblok afsluit.
Het break
trefwoord wordt gebruikt om de switch
-constructie te verlaten. De volgende switch
instructie gebruikt break
bijvoorbeeld instructies om te testen op de meest specifieke voorwaarde:
$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
}
}
In dit voorbeeld wordt de $var
variabele gemaakt en geïnitialiseerd naar een tekenreekswaarde van word2
. De switch
instructie maakt gebruik van de Regex-klasse om de variabelewaarde eerst te koppelen aan de term word2
. Omdat de variabelewaarde en de eerste test in de switch
instructie overeenkomen, wordt het eerste codeblok in de switch
instructie uitgevoerd.
Wanneer PowerShell de eerste break
instructie bereikt, wordt de switch
instructie afgesloten. Als de vier break
instructies uit het voorbeeld worden verwijderd, wordt aan alle vier de voorwaarden voldaan. In dit voorbeeld wordt de break
instructie gebruikt om resultaten weer te geven wanneer aan de meest specifieke voorwaarde wordt voldaan.
Gebruiken break
in een trap
-instructie
Als de laatste instructie die wordt uitgevoerd in de hoofdtekst van een trap
instructie is, wordt break
het foutobject onderdrukt en wordt de uitzondering opnieuw gegenereerd.
In het volgende voorbeeld wordt een DivideByZeroException-uitzondering gemaakt die wordt gevangen met behulp van de trap
-instructie.
function test {
trap [DivideByZeroException] {
Write-Host 'divide by zero trapped'
break
}
$i = 3
'Before loop'
while ($true) {
"1 / $i = " + (1 / $i--)
}
'After loop'
}
test
U ziet dat de uitvoering stopt bij de uitzondering. De After loop
wordt nooit bereikt.
De uitzondering wordt opnieuw gegenereerd nadat de trap
is uitgevoerd.
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.
Gebruik niet break
buiten een lus, switch
of trap
Wanneer break
wordt gebruikt buiten een constructie die deze rechtstreeks ondersteunt (lussen, switch
, trap
), zoekt PowerShell de aanroepstack op voor een omsluitende constructie. Als er geen insluitende constructie kan worden gevonden, wordt de huidige runspace stil beëindigd.
Dit betekent dat functies en scripts die per ongeluk een buiten een break
omsluitende constructie gebruiken die deze ondersteunt, per ongeluk hun aanroepers kunnen beëindigen.
Als u break
in een pijplijn break
gebruikt, zoals een ForEach-Object
scriptblok, wordt niet alleen de pijplijn afgesloten, maar wordt mogelijk ook de hele runspace beëindigd.