Udostępnij za pośrednictwem


about_Break

Krótki opis

Opisuje instrukcję, której można użyć do natychmiastowego zakończenia instrukcji foreach, for, while, do, switchlub trap .

Długi opis

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

Używanie break pętli in

break Gdy instrukcja pojawia się w pętli, takiej jak pętla foreach, for, dolubwhile, 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 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 ma 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 przy pierwszym dwóch uruchomieniu pętli, 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 break instrukcja jest uruchamiana, a pętla foreach kończy działanie.

Używanie elementu oznaczonego 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ętlach osadzonych ma to 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 zwróci wartość True, wykonanie skryptu pominie instrukcję po pętli oznaczonej etykietą. W tym przykładzie wykonanie rozpoczyna się ponownie od 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 z etykietą "czerwony". Jeśli zmienna $c zwróci wartość True, wykonanie kontrolki skryptu zostanie wznowione po pętli z etykietą "żółty".

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

Program PowerShell nie ogranicza możliwości wznowienia wykonywania etykiet. Etykieta może nawet przekazać kontrolę przez granice wywołań skryptu i funkcji.

Używanie break w instrukcji switch

switchW konstrukcji break 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 jako wartość 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, uruchamiany jest pierwszy blok kodu w instrukcji switch .

Gdy program PowerShell osiągnie pierwszą break instrukcję, instrukcja zostanie zakończona switch . Jeśli cztery break instrukcje zostaną usunięte z przykładu, zostaną spełnione wszystkie cztery warunki. W tym przykładzie użyto instrukcji break , aby wyświetlić wyniki, gdy zostanie spełniony najbardziej konkretny warunek.

Używanie break w instrukcji trap

Jeśli końcowa 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
ParentContainsErrorRecordException:
Line |
  10 |       "1 / $i = " + (1 / $i--)
     |       ~~~~~~~~~~~~~~~~~~~~~~~~
     | Attempted to divide by zero.

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

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

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

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

Zobacz też