about_Continue

Краткое описание

Описывает, как continue оператор немедленно возвращает поток программы в начало цикла программы, switch оператора или trap оператора.

Подробное описание

Оператор continue предоставляет способ выхода из текущего блока управления, но продолжить выполнение, а не завершить работу полностью. Инструкция поддерживает метки. Метка — это имя, назначаемое инструкции в скрипте.

Использование продолжения в циклах

Оператор без метки continue немедленно возвращает поток программы в верхнюю часть самого внутреннего цикла, управляемого оператором for, foreachdoили while оператором. Текущая итерация цикла завершается, и цикл продолжается со следующей итерацией.

В следующем примере поток программы возвращается в начало while цикла, если $ctr переменная равна 5. В результате отображаются все числа от 1 до 10, за исключением 5:

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

    Write-Host -Object $ctr
}

При использовании for цикла выполнение продолжается в <Repeat> инструкции, за которой следует <Condition> тест. В приведенном ниже примере бесконечный цикл не будет происходить, так как уменьшение $i происходит после 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--
    }
}

Использование помеченного продолжения в цикле

Оператор с меткой continue завершает выполнение итерации и передает управление целевой итерации или switch метки инструкции.

В следующем примере самый внутренний for завершается, когда $condition значение True , а итерация продолжается со вторым for циклом 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
            }
        }
    }
}

Использование инструкции switch

Оператор без метки continue в пределах switch завершает выполнение текущей switch итерации и передает управление в верхнюю часть switch , чтобы получить следующий входной элемент.

Когда один входной элемент continue выходит из всей switch инструкции. switch Когда входные данные являются коллекцией, switch тестирует каждый элемент коллекции. Завершает continue текущую итерацию и switch продолжается со следующим элементом.

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

Использование инструкции "Продолжить" в инструкции ловушки

Если последняя инструкция, выполненная в тексте trap инструкции, имеет continueзначение , обнаруженная ошибка автоматически игнорируется, и выполнение продолжается с инструкцией сразу после той, которая вызвала trap возникновение.

Не используйте продолжение за пределами цикла, коммутатора или ловушки

Если continue используется вне конструкции, которая напрямую поддерживает его (циклы, switch, ), trapPowerShell ищет стек вызовов для заключающей конструкции. Если он не может найти заключенную конструкцию, текущее пространство выполнения будет тихо завершено.

Это означает, что функции и сценарии, которые непреднамеренно используют continue вне заключающей конструкции, поддерживающей ее, могут случайно завершить вызовы.

Используя continue внутри конвейера ForEach-Object , например блок скрипта, не только выход из конвейера, он потенциально завершает весь пространство выполнения.

См. также