О продолжении
Краткое описание
Описывает, как инструкция continue
немедленно возвращает поток программы в начало цикла программы, switch
оператора или оператора trap
.
Подробное описание
Оператор continue
предоставляет способ выхода из текущего блока управления, но продолжить выполнение, а не полностью выйти. Оператор поддерживает метки.
Метка — это имя, присвоенное инструкции в скрипте.
Использование продолжения в циклах
Оператор без меток continue
немедленно возвращает поток программы в начало самого внутреннего цикла, управляемого оператором for
, foreach
do
или 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
}
}
}
}
Использование continue в операторе 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
Использование инструкции continue в операторе trap
Если окончательная инструкция, выполненная в тексте trap
инструкции, является continue
, перехватаемая ошибка игнорируется автоматически, и выполнение продолжается с инструкцией сразу после той, которая вызвала trap
возникновение.
Не используйте продолжение за пределами цикла, переключателя или ловушки
Если continue
используется вне конструкции, которая напрямую поддерживает его (циклы, switch
, ), trap
PowerShell ищет стек вызовов для включающей конструкции. Если не удается найти включающую конструкцию, текущее пространство выполнения будет тихо завершено.
Это означает, что функции и скрипты, которые непреднамеренно используют continue
вне включающей конструкции, поддерживающей ее, могут случайно завершить свои вызывающие объекты.
Использование continue
внутри конвейера, например ForEach-Object
блока скрипта, не только завершает конвейер, tt потенциально завершает весь пространство выполнения.