Megosztás a következőn keresztül:


about_Break

Rövid leírás

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

Hosszú leírás

A 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 ciklusban, például egy foreach, for, dovagy while ciklusban, a PowerShell azonnal kilép a hurokból.

A break utasítás tartalmazhat 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 foreach, forvagy whileegy szkriptben.

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

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

Ebben a példában a 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 a break utasítást olyan hurokban, amelyben belső feltételnek kell teljesülnie. Tekintse meg 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 a foreach utasítás iterálja a $varB tömböt. A if utasítás a ciklus első két futtatásakor hamis értéket ad vissza, a $i változó pedig 1-zel növekszik. A ciklus harmadik futtatásakor $i 2, a $val változó pedig 30. Ekkor fut a break utasítás, és a foreach ciklus kilép.

Címkézett break használata hurokban

Egy break utasítás tartalmazhat 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 hurokbó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 ez más eredményt ad, mint a break kulcsszó, amikor önmagában használja. Ebben a példában egy while utasítást tartalmazó for utasítás látható:

: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

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 a $a = $cutasítással kezdődik.

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

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

A break kulcsszó a switch szerkezet elhagyására szolgál. Az alábbi switch utasítás például break utasításokkal 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 word2sztringértékre. 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 a switch utasítás első tesztje egyezik, a switch utasítás első kódblokkja fut.

Amikor a PowerShell eléri az első break utasítást, a 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 a break utasítást használja az eredmények megjelenítésére, ha a legspecifikusabb feltétel teljesül.

Használat break utasításban trap

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

Az alábbi példa létrehoz egy DivideByZeroException kivételt, 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. A After loop soha nem érik el. A kivétel a trap végrehajtása után lesz újra eldobva.

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 közvetlenül támogató szerkezeten (hurkok, switch, trap) kívül van használva, a PowerShell a hívásverem 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 egy folyamaton breakbelül (például egy ForEach-Object szkriptblokkon) belül használjabreak, nem csak kilép a folyamatból, hanem a teljes futtatókörnyezetet is leállítja.

Lásd még