about_Break
Krótki opis
Opisuje instrukcję, której można użyć do natychmiastowego zakończenia instrukcji foreach
, for
, while
, do
, switch
lub 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
, do
lubwhile
, 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
, for
lub 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
switch
W 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ą , switch
lub 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ą.