Udostępnij za pośrednictwem


o_Kontynuuj

Krótki opis

Opisuje sposób, w jaki instrukcja continue natychmiast zwraca przepływ programu na początek pętli programu, instrukcji switch lub instrukcji trap.

Długi opis

Instrukcja continue umożliwia wyjście z bieżącego bloku sterowania, ale kontynuowanie wykonywania, a nie całkowite zakończenie. Instrukcja obsługuje etykiety. Etykieta to nazwa, którą przypisujesz do instrukcji w skrypcie.

Używanie kontynuacji w pętlach

Instrukcja continue bez etykiet natychmiast zwraca przepływ programu w górnej części najbardziej wewnętrznej pętli kontrolowanej przez instrukcję for, foreach, dolub while. Bieżąca iteracja pętli jest przerywana, a pętla kontynuuje kolejną iterację.

W poniższym przykładzie przepływ programu powraca do góry pętli while, jeśli zmienna $ctr jest równa 5. W związku z tym wszystkie liczby z zakresu od 1 do 10 są wyświetlane z wyjątkiem 5:

while ($ctr -lt 10)
{
    $ctr += 1
    if ($ctr -eq 5)
    {
        continue
    }

    Write-Host -Object $ctr
}

W przypadku korzystania z pętli for proces wykonania jest kontynuowany od instrukcji <Repeat>, a następnie wykonywany jest test <Condition>. W poniższym przykładzie nieskończona pętla nie wystąpi, ponieważ zmniejszenie $i następuje po słowie kluczowym continue.

#   <Init>  <Condition> <Repeat>
for ($i = 0; $i -lt 10; $i++)
{
    Write-Host -Object $i
    if ($i -eq 5)
    {
        continue
        # Will not result in an infinite loop.
        $i--
    }
}

Używanie oznaczonego polecenia 'continue' w pętli

Instrukcja oznaczona etykietą continue kończy wykonywanie iteracji i przenosi kontrolę do docelowej otaczającej pętli lub etykiety instrukcji switch.

W poniższym przykładzie najbardziej wewnętrzna for jest przerywana, gdy $condition jest true, a iteracja kontynuuje drugą pętlę for w labelB.

:labelA for ($i = 1; $i -le 10; $i++) {
    :labelB for ($j = 1; $j -le 10; $j++) {
        :labelC for ($k = 1; $k -le 10; $k++) {
            if ($condition) {
                continue labelB
            } else {
                $condition = Update-Condition
            }
        }
    }
}

Używanie instrukcji continue w instrukcji switch

Nieoznaczona instrukcja continue w switch kończy wykonywanie bieżącej iteracji switch i przenosi kontrolę na początek switch, aby uzyskać następny element wejściowy.

Gdy istnieje jeden element wejściowy, continue kończy całą instrukcję switch. Gdy dane wejściowe switch są kolekcją, switch testuje każdy element kolekcji. continue kończy bieżącą iterację, a switch kontynuuje działanie z następnym elementem.

switch (1,2,3) {
  2 { continue }  # moves on to the next element, 3
  default { $_ }
}
1
3

Używanie instrukcji continue w pułapce

Jeśli ostateczna instrukcja wykonywana w treści instrukcji trap jest continue, złapany błąd jest po cichu ignorowany, a wykonanie jest kontynuowane natychmiast po instrukcji, która spowodowała wystąpienie trap.

Nie należy używać kontynuacji poza pętlą, przełącznikiem lub pułapką

Gdy continue jest używana poza konstrukcją, która bezpośrednio ją obsługuje (pętle, switch, trap), program PowerShell wygląda stos wywołań dla otaczającej konstrukcji. Jeśli nie można odnaleźć otaczającej konstrukcji, bieżące środowisko uruchomieniowe jest przerywane bez żadnych powiadomień.

Oznacza to, że funkcje i skrypty, które przypadkowo używają continue poza otaczającą konstrukcją, która ją obsługuje, mogą przypadkowo zakończyć ich wywołujących.

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

Zobacz także