about_Continue
介绍了 continue
语句如何立即将程序流返回到程序循环、switch
语句或 trap
语句的顶部。
continue
语句提供了一种退出当前控制块,但继续执行而不是完全退出的方法。 该语句支持标签。
标签是分配给脚本中的语句的名称。
不带标签的 continue
语句会立即将程序流返回到由 for
、foreach
、do
或 while
语句控制的最内层循环的顶部。 循环的当前迭代将终止,循环将继续进行下一次迭代。
在下面的示例中,如果 $ctr
变量等于 5,程序流将返回到 while
循环的顶部。 因此,除了 5 之外,将显示介于 1 和 10 之间的所有数字:
while ($ctr -lt 10)
{
$ctr += 1
if ($ctr -eq 5)
{
continue
}
Write-Host -Object $ctr
}
使用 for
循环时,会在 <Repeat>
语句处继续执行,然后进行 <Condition>
测试。 以下示例中不会发生无限循环,因为 $i
的递减发生在 continue
关键字之后。
# <Init> <Condition> <Repeat>
for ($i = 0; $i -lt 10; $i++)
{
Write-Host -Object $i
if ($i -eq 5)
{
continue
# Will not result in an infinite loop.
$i--
}
}
带标签的 continue
语句终止迭代的执行,并将控制权转移到目标封闭迭代或 switch
语句标签。
在以下示例中,当 $condition
为 True 时,最内层的 for
终止,并在 labelB
处继续进行第二个 for
循环。
:labelA for ($i = 1; $i -le 10; $i++) {
:labelB for ($j = 1; $j -le 10; $j++) {
:labelC for ($k = 1; $k -le 10; $k++) {
if ($condition) {
continue labelB
} else {
$condition = Update-Condition
}
}
}
}
switch
中不带标签的 continue
语句会终止当前 switch
迭代的执行,并将控制权转移到 switch
的顶部以获取下一个输入项。
当存在单个输入项时,continue
将退出整个 switch
语句。
当 switch
输入是集合时,switch
将测试集合的每个元素。 continue
退出当前迭代,switch
从下一个元素继续执行。
switch (1,2,3) {
2 { continue } # moves on to the next element, 3
default { $_ }
}
1
3
如果 trap
语句主体中执行的最后一条语句是 continue
,则捕获的错误将被静默忽略,并继续执行紧接在导致 trap
发生的语句之后的语句。
当在直接支持它的构造(循环、switch
、trap
)之外使用 continue
时,PowerShell 会在调用堆栈中查找封闭构造。 如果找不到封闭的构造,当前运行空间将被悄悄终止。
这意味着,如果函数和脚本无意中在支持 continue
的封闭结构外部使用了它,则可能会无意中终止其调用方。
在管道内(例如在 ForEach-Object
脚本块内)使用 continue
不仅会退出管道,还可能会终止整个运行空间。