Dela via


about_Break

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. -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, 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 -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 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>) {
  foreach ($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 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. 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 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 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 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, switch, eller trap

När break används utanför en konstruktion som har direkt stöd för den (loopar, switch, trap), ser PowerShell ut 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 en ForEach-Object scriptblock, avslutas inte bara pipelinen, utan avslutar potentiellt hela körningsytan.

Se även