about_Break

Rövid leírás

Az utasítást break ismerteti, amely lehetővé teszi az aktuális vezérlőblokkból való kilépést.

Hosszú leírás

Az break utasítással kiléphet az aktuális vezérlőblokkból. A végrehajtás a következő utasításnál folytatódik a vezérlőblokk után. Az utasítás támogatja a címkéket. A címke egy szkriptben lévő utasításhoz hozzárendelt név.

Ciklusok használata break

Amikor egy break utasítás megjelenik egy hurokban, például egy foreach, for, dovagy while hurokban, a PowerShell azonnal kilép a ciklusból.

Az break utasítások tartalmazhatnak olyan címkét, amely lehetővé teszi a beágyazott hurkokból való kilépést. A címkék bármilyen ciklus kulcsszót megadhatnak, például foreachegy szkriptben, forvagy whileegy szkriptben.

Az alábbi példa bemutatja, hogyan lehet utasítással break kilépni egy utasításból for :

for($i=1; $i -le 10; $i++) {
   Write-Host $i
   break
}

Ebben a példában az break utasítás kilép a for ciklusból, amikor a $i változó értéke 1. Annak ellenére, hogy az for utasítás értéke True (Igaz) lesz, amíg $i 10-nél nagyobb nem lesz, a PowerShell a ciklus első futtatásakor eléri a for törési utasítást.

Gyakrabban használják az break utasítást olyan hurokban, amelyben egy belső feltételnek teljesülnie kell. Vegyük példaként a következő foreach utasítást:

$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"

Ebben a példában az foreach utasítás iterálja a $varB tömböt. Az if utasítás a ciklus első két futtatásakor hamis értéket ad vissza, a változó $i pedig 1-zel növekszik. A ciklus harmadik futtatása $i 2, a $val változó pedig 30. Ezen a ponton az break utasítás fut, és a foreach hurok kilép.

Ciklusban címkézett break címke használata

Az break utasítások tartalmazhatnak címkét. Ha a break kulcsszót címkével használja, a PowerShell az aktuális ciklusból való kilépés helyett kilép a címkézett ciklusból. A címke egy kettőspont, amelyet egy hozzárendelt név követ. A címkének egy utasítás első tokenjének kell lennie, amelyet a ciklus kulcsszónak kell követnie, például while.

break áthelyezi a végrehajtást a címkézett hurokból. A beágyazott hurkokban ennek más az eredménye, mint a break kulcsszónak, amikor önmagában használja. Ez a példa egy while utasítással rendelkező utasítással for rendelkezik:

: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

Ha a 2 . feltétel értéke Igaz, a szkript végrehajtása a címkézett hurok után az utasításra ugrik. A példában a végrehajtás az utasítással $a = $ckezdődik újra.

A következő példában látható módon számos címkézett hurkot ágyazhat be.

: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"

Ha a $b változó értéke Igaz, a szkript végrehajtása a "piros" címkével ellátott ciklus után folytatódik. Ha a $c változó értéke Igaz, a szkriptvezérlő végrehajtása a "sárga" címkével ellátott ciklus után folytatódik.

Ha a $a változó értéke Igaz, a végrehajtás a legbelső hurok után folytatódik. Nincs szükség címkére.

A PowerShell nem korlátozza, hogy a címkék milyen mértékben folytathatják a végrehajtást. A címke még a szkriptek és függvényhívások határán is át tudja adni a vezérlést.

Használat break utasításban switch

switchEgy szerkezetben a break PowerShell kilép a switch kódblokkból.

A break kulcsszó a szerkezet elhagyására switch szolgál. A következő switch utasítás például utasítások használatával break teszteli a legspecifikusabb feltételt:

$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
    }
}

Ebben a példában a $var változó létrejön és inicializálódik egy sztringértékre word2. Az switch utasítás a Regex osztályt használja a változó értékének először a kifejezéssel word2való egyeztetéséhez. Mivel a változó értéke és az switch utasítás első tesztje egyezik, az utasítás első kódblokkja switch fut.

Amikor a PowerShell eléri az első break utasítást, az switch utasítás kilép. Ha a négy break utasítás el lesz távolítva a példából, mind a négy feltétel teljesül. Ez a példa az utasítást használja az break eredmények megjelenítésére, ha a legspecifikusabb feltétel teljesül.

Használat break utasításban trap

Ha az utasítás törzsében trap végrehajtott végső utasítás az break, a hibaobjektum el lesz tiltva, és a kivétel újra lesz vetve.

Az alábbi példa egy DivideByZeroException kivételt hoz létre, amely az trap utasítás használatával csapdába esik.

function test {
  trap [DivideByZeroException] {
    Write-Host 'divide by zero trapped'
    break
  }

  $i = 3
  'Before loop'
  while ($true) {
     "1 / $i = " + (1 / $i--)
  }
  'After loop'
}
test

Figyelje meg, hogy a végrehajtás a kivételnél leáll. Soha After loop nem érik el. A kivétel újra lesz vetve a trap végrehajtás után.

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.

Ne használjon break hurkon kívül, switchvagy trap

Ha break olyan szerkezeten kívül használják, amely közvetlenül támogatja azt (hurkok, switch), trapa PowerShell megkeresi a hívásvermet egy belefoglaló szerkezethez. Ha nem talál belefoglaló szerkezetet, az aktuális futtatótér csendesen leáll.

Ez azt jelenti, hogy azok a függvények és szkriptek, amelyek véletlenül egy break külső szerkezetet használnak, amely támogatja azt, véletlenül leállíthatják a hívóikat.

Ha break egy folyamaton break( például egy ForEach-Object szkriptblokkon) belül használja, nem csak kilép a folyamatból, hanem a teljes futtatókörnyezetet is leállítja.

Lásd még