简短说明
描述该 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 变量等于 1 时退出 $i 循环。 即使 for 语句在 大于 10 之前计算结果为 $i,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,则脚本的执行将在标记为“red”的循环后恢复。 如果 $c 变量的计算结果为 True,则脚本控件的执行将在标记为“yellow”的循环后恢复。
如果 $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,则错误对象将被抑制并重新引发异常。
以下示例创建了一个使用 语句捕获的 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 , switch或 trap
当在直接支持它的构造(循环、break、switch)之外使用 trap 时,PowerShell 会在调用堆栈中查找封闭构造。 如果找不到封闭的构造,当前运行空间将被悄悄终止。
这意味着,如果函数和脚本无意中在支持它的封闭结构之外使用了 break,则可能会无意中终止其调用方。
在管道 break 内使用 break(例如 ForEach-Object 脚本块)不仅会退出管道,还可能终止整个运行空间。