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
, ), trap
PowerShell ищет стек вызовов для включающей конструкции. Если не удается найти включающую конструкцию, текущее пространство выполнения будет тихо завершено.
Это означает, что функции и скрипты, которые непреднамеренно используют break
за пределами включающей конструкции, поддерживающей ее, могут непреднамеренно завершить работу вызывающих объектов.
Использование break
внутри конвейера break
, например блока скрипта ForEach-Object
, не только завершает конвейер, но и может завершить все пространство выполнения.