Sdílet prostřednictvím


o_Přerušení

Krátký popis

Popisuje příkaz break, který poskytuje způsob, jak ukončit aktuální řídicí blok.

Dlouhý popis

Příkaz break poskytuje způsob, jak ukončit aktuální řídicí blok. Provádění pokračuje po dalším příkazu za řídicím blokem. Příkaz podporuje popisky. Štítek je název, který přiřadíte k příkazu ve skriptu.

Použití break ve smyčce

Když se příkaz break zobrazí ve smyčce, jako je například foreach, for, donebo smyčka while, PowerShell smyčku okamžitě ukončí.

Příkaz break může obsahovat popisek, který umožňuje ukončit vložené smyčky. Popisek může ve skriptu zadat libovolné klíčové slovo smyčky, například foreach, fornebo while.

Následující příklad ukazuje, jak pomocí příkazu break ukončit příkaz for:

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

V tomto příkladu příkaz break ukončí smyčku for, když se $i proměnná rovná 1. I když se příkaz for vyhodnotí jako true, dokud $i není větší než 10, PowerShell dosáhne příkazu break při prvním spuštění smyčky for.

Častěji se používá příkaz break ve smyčce, kde musí být splněna vnitřní podmínka. Podívejte se na následující příklad příkazu foreach:

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

V tomto příkladu příkaz foreach iteruje pole $varB. Příkaz if se vyhodnotí jako Nepravda, první dvakrát se smyčka spustí a proměnná $i se zvýší o 1. Třetí čas, kdy se smyčka spustí, $i se rovná 2 a $val proměnná se rovná 30. V tomto okamžiku se příkaz break spustí a smyčka foreach se ukončí.

Použití popisku break ve smyčce

Příkaz break může obsahovat popisek. Pokud použijete klíčové slovo break s popiskem, PowerShell ukončí označenou smyčku místo ukončení aktuální smyčky. Popisek je dvojtečka následovaná názvem, který přiřadíte. Popisek musí být prvním tokenem v příkazu a musí následovat klíčové slovo smyčky, například while.

break přesune provádění mimo označenou smyčku. Ve vložených smyček má tento výsledek jiný výsledek než klíčové slovo break, když ho používá sám. Tento příklad obsahuje příkaz while s příkazem for:

: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

Pokud se podmínka 2 vyhodnotí jako true, spuštění skriptu přeskočí na příkaz za označenou smyčkou. V příkladu spuštění znovu spustí příkaz $a = $c.

Můžete vnořit mnoho označených smyček, jak je znázorněno v následujícím příkladu.

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

Pokud se proměnná $b vyhodnotí jako True, spuštění skriptu se obnoví po smyčce označené jako "červená". Pokud se proměnná $c vyhodnotí jako True, spuštění ovládacího prvku skriptu se obnoví po smyčce označené jako "žlutá".

Pokud se proměnná $a vyhodnotí jako True, provádění se obnoví po vnitřní smyčce. Není potřeba žádný popisek.

PowerShell neomezuje, jak daleko popisky můžou pokračovat v provádění. Popisek může dokonce předat řízení napříč hranicemi volání skriptu a funkce.

Použití break v příkazu switch

V konstruktoru switchbreak způsobí, že PowerShell ukončí blok kódu switch.

Klíčové slovo break slouží k opuštění konstruktoru switch. Například následující příkaz switch používá příkazy break k otestování pro nejvýraznější podmínku:

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

V tomto příkladu je $var proměnná vytvořena a inicializována na řetězcovou hodnotu word2. Příkaz switch používá třídu Reg ex k porovnání hodnoty proměnné jako první s termínem word2. Vzhledem k tomu, že hodnota proměnné a první test v příkazu switch odpovídají, spustí se první blok kódu v příkazu switch.

Když PowerShell dosáhne prvního příkazu break, příkaz switch se ukončí. Pokud jsou ze příkladu odebrány čtyři příkazy break, jsou splněny všechny čtyři podmínky. Tento příklad používá příkaz break k zobrazení výsledků, když je splněna nejvýraznější podmínka.

Použití break v příkazu trap

Pokud je konečný příkaz spuštěný v těle příkazu trapbreak, je potlačen objekt chyby a výjimka je znovu vyvolána.

Následující příklad vytvoří DivideByZeroException výjimku, která je zachycena pomocí příkazu 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

Všimněte si, že provádění se zastaví na výjimce. After loop se nikdy nedosáhl. Po spuštění trap se výjimka znovu vyvolá.

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.

Nepoužívejte break mimo smyčku, switchnebo trap

Pokud se break používá mimo konstruktor, který ho přímo podporuje (smyčky, switch, trap), PowerShell hledá zásobník volání pro uzavřený konstruktor. Pokud nemůže najít obklopující konstrukci, aktuální runspace se tiše ukončí.

To znamená, že funkce a skripty, které neúmyslně používají break mimo uzavřený konstruktor, který ji podporuje, může neúmyslně ukončit své volající.

Použití break v kanálu break, jako je například blok skriptu ForEach-Object, a ne pouze ukončí kanál, potenciálně ukončí celý runspace.

Viz také