about_Break

Krótki opis

Opisuje instrukcję break , która umożliwia wyjście z bieżącego bloku sterowania.

Długi opis

Instrukcja break umożliwia wyjście z bieżącego bloku sterowania. Wykonanie jest kontynuowane w następnej instrukcji po bloku sterowania. Instrukcja obsługuje etykiety. Etykieta to nazwa przypisana do instrukcji w skry skrycie.

Używanie break w pętlach

break Gdy instrukcja jest wyświetlana w pętli, takiej jak pętla foreach, for, lubdowhile, program PowerShell natychmiast zamyka pętlę.

Instrukcja break może zawierać etykietę, która umożliwia wyjście z osadzonych pętli. Etykieta może określać dowolne słowo kluczowe pętli, takie jak foreach, forlub while, w skry skrycie.

W poniższym przykładzie pokazano, jak użyć break instrukcji w celu zakończenia for instrukcji:

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

W tym przykładzie break instrukcja kończy pętlę for , gdy zmienna $i jest równa 1. Mimo że for instrukcja zwraca wartość True, dopóki $i wartość nie będzie większa niż 10, program PowerShell osiągnie instrukcję break przy pierwszym uruchomieniu for pętli.

Częściej używa się instrukcji break w pętli, w której musi zostać spełniony warunek wewnętrzny. Rozważmy następujący foreach przykład instrukcji:

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

W tym przykładzie foreach instrukcja iteruje tablicę $varB . Instrukcja if oblicza wartość False przez pierwsze dwa razy, gdy pętla jest uruchamiana, a zmienna $i jest zwiększana o 1. Po raz trzeci pętla jest uruchamiana, $i równa 2, a zmienna $val równa 30. W tym momencie instrukcja break jest uruchamiana, a pętla foreach kończy działanie.

Używanie etykiety break w pętli

Instrukcja break może zawierać etykietę. Jeśli używasz słowa kluczowego break z etykietą, program PowerShell zamyka pętlę z etykietą zamiast zamykać bieżącą pętlę. Etykieta to dwukropek, po którym następuje przypisana nazwa. Etykieta musi być pierwszym tokenem w instrukcji i musi być zgodna ze słowem kluczowym pętli, takim jak while.

break przenosi wykonywanie z pętli oznaczonej etykietą. W pętli osadzonych ma inny wynik niż break słowo kluczowe, gdy jest używane przez siebie. Ten przykład zawiera instrukcję while z instrukcją 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

Jeśli warunek 2 ma wartość True, wykonanie skryptu przechodzi w dół do instrukcji po pętli oznaczonej etykietą. W tym przykładzie wykonanie rozpoczyna się ponownie za pomocą instrukcji $a = $c.

Można zagnieżdżać wiele oznaczonych pętlami, jak pokazano w poniższym przykładzie.

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

Jeśli zmienna $b zwróci wartość True, wykonanie skryptu zostanie wznowione po pętli oznaczonej jako "czerwony". Jeśli zmienna $c zwróci wartość True, wykonanie kontrolki skryptu zostanie wznowione po pętli oznaczonej jako "żółty".

Jeśli zmienna $a zwróci wartość True, wykonanie zostanie wznowione po pętli najbardziej wewnętrznej. Etykieta nie jest potrzebna.

Program PowerShell nie ogranicza możliwości wznowienia wykonywania etykiet. Etykieta może nawet przekazać kontrolę między granicami skryptu i funkcji.

Używanie break w instrukcji switch

W konstrukcji switchbreak powoduje zamknięcie bloku kodu przez switch program PowerShell.

Słowo break kluczowe jest używane do opuszczenia switch konstrukcji. Na przykład poniższa switch instrukcja używa break instrukcji do testowania pod kątem najbardziej określonego warunku:

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

W tym przykładzie zmienna jest tworzona $var i inicjowana do wartości ciągu .word2 Instrukcja switch używa klasy Regex , aby najpierw dopasować wartość zmiennej do terminu word2. Ponieważ wartość zmiennej i pierwszy test w instrukcji switch są zgodne, pierwszy blok kodu w instrukcji switch jest uruchamiany.

Gdy program PowerShell osiągnie pierwszą break instrukcję, switch instrukcja kończy działanie. Jeśli cztery break instrukcje zostaną usunięte z przykładu, zostaną spełnione wszystkie cztery warunki. W tym przykładzie użyto instrukcji , aby wyświetlić wyniki po spełnieniu break najbardziej określonego warunku.

Używanie break w instrukcji trap

Jeśli ostateczna instrukcja wykonywana w treści instrukcji trap to break, obiekt błędu jest pomijany, a wyjątek jest zgłaszany ponownie.

Poniższy przykład tworzy wyjątek DivideByZeroException , który jest uwięziony przy użyciu instrukcji 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

Zwróć uwagę, że wykonanie zatrzymuje się na wyjątku. Nigdy After loop nie osiągnięto. Wyjątek jest zgłaszany ponownie po wykonaniu trap .

Before loop
1 / 3 = 0.333333333333333
1 / 2 = 0.5
1 / 1 = 1
divide by zero trapped
Attempted to divide by zero.
At line:10 char:6
+      "1 / $i = " + (1 / $i--)
+      ~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], ParentContainsErrorRecordException
    + FullyQualifiedErrorId : RuntimeException

Nie należy używać break poza pętlą, switchlub trap

Gdy break jest używany poza konstrukcją, która bezpośrednio ją obsługuje (pętle, switch, trap), program PowerShell wyszukuje stos wywołań dla konstrukcji otaczającej. Jeśli nie można odnaleźć otaczającej konstrukcji, bieżąca przestrzeń uruchomieniowa jest po cichu przerywana.

Oznacza to, że funkcje i skrypty, które przypadkowo używają break zewnętrznej konstrukcji otaczającej, która obsługuje ją, może przypadkowo przerwać ich rozmówców.

Użycie break wewnątrz potoku break, takiego jak ForEach-Object blok skryptu, nie tylko kończy potok, ale potencjalnie kończy całą przestrzeń uruchamiania.

Zobacz też