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
, lubdo
while
, 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 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 switch
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 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
ParentContainsErrorRecordException:
Line |
10 | "1 / $i = " + (1 / $i--)
| ~~~~~~~~~~~~~~~~~~~~~~~~
| Attempted to divide by zero.
Nie należy używać break
poza pętlą, switch
lub 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.