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


about_Break

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

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

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

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

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

break Когда оператор отображается в цикле, например foreachцикл , fordoили while цикл, PowerShell немедленно выходит из цикла.

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

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

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

В этом примере оператор завершает for цикл, break когда $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>) {
  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

Если условие 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
Attempted to divide by zero.
At line:10 char:6
+      "1 / $i = " + (1 / $i--)
+      ~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], ParentContainsErrorRecordException
    + FullyQualifiedErrorId : RuntimeException

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

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

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

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

См. также