Поделиться через


about_Break

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

Описывает инструкцию break, которая предоставляет способ выхода из текущего блока управления.

Длинное описание

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

Использование break циклов

Если оператор break отображается в цикле, например foreach, for, doили цикле while, PowerShell немедленно завершает цикл.

Оператор break может включать метку, которая позволяет выйти из внедренных циклов. Метка может указать любое ключевое слово цикла, например foreach, forили whileв скрипте.

В следующем примере показано, как использовать оператор break для выхода из инструкции for:

for($i=1; $i -le 10; $i++) {
   Write-Host $i
   break
}

В этом примере оператор break завершает цикл for, когда переменная $i равна 1. Несмотря на то, что for оператор оценивается как True , пока $i не превышает 10, PowerShell достигает инструкции останова при первом for запуске цикла.

Чаще всего используется оператор break в цикле, где должно выполняться внутреннее условие. Рассмотрим следующий пример инструкции foreach:

$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"

В этом примере оператор foreach итерирует массив $varB. Оператор if оценивается как False в первый раз, когда выполняется цикл, а переменная $i увеличивается на 1. При третьем запуске цикла $i равно 2, а переменная $val равна 30. На этом этапе выполняется инструкция break, а цикл foreach завершается.

Использование помеченного break в цикле

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

break перемещает выполнение из цикла с меткой. В внедренных циклах этот результат отличается от ключевого слова break, если он используется самостоятельно. В этом примере есть оператор while с оператором for:

:myLabel while (<condition 1>) {
  foreach ($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

Если условие 2 оценивается как True, выполнение скрипта пропускается до инструкции после помеченного цикла. В примере выполнение начинается снова с инструкции $a = $c.

Можно вложить много помеченных циклов, как показано в следующем примере.

: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"

Если переменная $b имеет значение True, выполнение скрипта возобновляется после цикла, помеченного как "красный". Если переменная $c имеет значение True, выполнение элемента управления скриптом возобновляется после цикла, помеченного как желтый.

Если переменная $a оценивается как True, выполнение возобновляется после самого внутреннего цикла. Метка не требуется.

PowerShell не ограничивает, насколько далеко метки могут возобновить выполнение. Метка может даже передавать контроль между границами вызовов скриптов и функций.

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

switch В конструкции break PowerShell завершает switch блок кода.

Ключевое слово break используется для выхода из конструкции switch. Например, следующая инструкция switch использует операторы break для проверки наиболее конкретного условия:

$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
    }
}

В этом примере переменная $var создается и инициализирована в строковое значение word2. Оператор switch использует класс Regex для сопоставления значения переменной в первую очередь с термином word2. Так как значение переменной и первый тест в инструкции switch совпадают, выполняется первый блок кода в инструкции switch.

Когда PowerShell достигает первого оператора break, оператор switch завершает работу. Если из примера удаляются четыре оператора break, выполняются все четыре условия. В этом примере оператор break используется для отображения результатов при выполнении наиболее конкретного условия.

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

Если окончательная инструкция, выполняемая в тексте инструкции trap, break, объект ошибки подавляется, а исключение создается повторно.

В следующем примере создается исключение DivideByZeroException , которое находится в ловушке с помощью инструкции 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

Обратите внимание, что выполнение останавливается при исключении. After loop никогда не достигается. Исключение создается повторно после выполнения 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.

Не используйте break вне цикла или switchtrap

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

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

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

См. также