about_Break

Korte beschrijving

Beschrijft een instructie die u kunt gebruiken om , , , , , foreachof for statements onmiddellijk af te sluitenwhile. doswitchtrap

Lange beschrijving

De instructie break biedt een manier om het huidige besturingsblok af te sluiten. Uitvoering gaat verder met de volgende instructie na het besturingsblok. De verklaring ondersteunt labels. Een label is een naam die u toewijst aan een instructie in een script.

break in lussen gebruiken

Wanneer een break instructie wordt weergegeven in een lus, zoals een foreach, for, doof while lus, wordt de lus onmiddellijk afgesloten.

Een break instructie kan een label bevatten waarmee u ingesloten lussen kunt afsluiten. Een label kan elk luswoord opgeven, zoals foreach, forof 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 sluit de break-instructie de for lus af wanneer de $i variabele gelijk is aan 1. Hoewel de for instructie resulteert in True totdat $i groter is dan 10, bereikt PowerShell de onderbrekingsinstructie de eerste keer dat de for lus wordt uitgevoerd.

Het is gebruikelijker om de break-instructie te gebruiken in een lus waar aan een binnenste voorwaarde moet worden voldaan. Bekijk het volgende foreach-instructievoorbeeld:

$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 de $varB-matrix herhaald. De if-instructie resulteert in Onwaar, de eerste twee keer dat de lus wordt uitgevoerd en de variabele $i met 1 wordt verhoogd. De derde keer dat de lus wordt uitgevoerd, is $i gelijk aan 2 en is de $val variabele gelijk aan 30. Op dit moment wordt de break instructie uitgevoerd en wordt de foreach lus afgesloten.

Een gelabelde break in een lus gebruiken

Een break instructie kan een label bevatten. Als u het trefwoord break 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 moet worden gevolgd door het luswoord, zoals while.

break de uitvoering uit de gelabelde lus verplaatst. In ingesloten lussen heeft dit een ander resultaat dan het break trefwoord heeft wanneer het zelf wordt gebruikt. In dit voorbeeld ziet u 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 resulteert in True, wordt de uitvoering van het script overgeslagen naar de instructie na de gelabelde lus. In het voorbeeld wordt de uitvoering opnieuw gestart 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 nadat de lus geel is gelabeld.

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 controle doorgeven over de grenzen van scripts en functie-aanroepen.

break gebruiken in een switch instructie

In een switch-constructie zorgt break ervoor dat PowerShell het codeblok van switch afsluit.

Het break trefwoord wordt gebruikt om de switch constructie te verlaten. De volgende switch-instructie gebruikt bijvoorbeeld break 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 instructie switch maakt gebruik van de Regex-klasse om eerst de variabelewaarde te vergelijken met de term word2. Omdat de variabele waarde en de eerste test in de switch-instructie overeenkomen, wordt het eerste codeblok in de instructie switch uitgevoerd.

Wanneer PowerShell de eerste break-instructie bereikt, wordt de switch-instructie afgesloten. Als de vier break instructies uit het voorbeeld worden verwijderd, worden 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.

break gebruiken in een trap instructie

Als de laatste instructie wordt uitgevoerd in de hoofdtekst van een trap instructie break, wordt het foutobject onderdrukt en wordt de uitzondering opnieuw gegenereerd.

In het volgende voorbeeld maakt u een DivideByZeroException-uitzondering die wordt opgesloten 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 is nooit bereikt. De uitzondering wordt opnieuw gegenereerd nadat de trap wordt 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 break niet buiten een lus, switchof trap

Wanneer break buiten een constructie wordt gebruikt die deze rechtstreeks ondersteunt (lussen, switch, trap), zoekt PowerShell hogerop in de aanroepstack naar een omhullende constructie. Als er geen omsluitconstructie kan worden gevonden, wordt de huidige runspace ongemerkt beëindigd.

Dit betekent dat functies en scripts die per ongeluk een break buiten een omsluitconstructie gebruiken die het ondersteunt, hun bellers per ongeluk kunnen beëindigen.

Als u break gebruikt in een pijplijn break, zoals een ForEach-Object scriptblok, wordt de pijplijn niet alleen afgesloten, maar wordt de hele runspace mogelijk beëindigd.

Zie ook