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


about_Break

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

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

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

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

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

break Когда оператор отображается в цикле, например foreach, for, doили 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 достигает оператора break при 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, выполнение скрипта возобновляется после цикла с меткой "red". $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, объект error подавляется и исключение создается повторно.

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

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

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

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

См. также раздел