about_Break

Kort beskrivning

Beskriver -instruktionen break , som ger ett sätt att avsluta det aktuella kontrollblocket.

Lång beskrivning

Instruktionen break är 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, 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 -instruktionen break loopen for när variabeln $i är lika med 1. Även om -instruktionen for utvärderas till Sant tills $i ä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 som är 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 nyckelordet break 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 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 utvärderas till True återupptas körningen $a 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 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 strängvärdet word2. - switch instruktionen använder Regex-klassen 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 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 efter körningen trap .

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) letar PowerShell upp anropsstacken för en omslutande konstruktion. Om det inte går att hitta en omslutande konstruktion avslutas det aktuella körningsutrymmet 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 inuti en pipeline break, till exempel ett ForEach-Object skriptblock, avslutas inte bara pipelinen, utan kan potentiellt avsluta hela körningsutrymmet.

Se även