为什么在ForEach-Object中继续运行就像break一样?

时间:2012-03-23 06:57:41

标签: powershell

$arr = @(1..10)
$arr | ForEach-Object {
    if ($_ -eq 5) { continue }
    "output $_"
}

结果:

output 1
output 2
output 3
output 4

$arr = @(1..10)
$arr | ForEach-Object {
    if ($_ -eq 5) { break }
    "output $_"
}

结果:

output 1
output 2
output 3
output 4

为什么?

2 个答案:

答案 0 :(得分:16)

因为continuebreak用于循环而foreach-object是cmdlet。行为并不是您所期望的,因为它只是停止整个脚本(在原始代码之后添加一条语句,您将看到该语句不会运行)

要获得与foreach循环中使用的继续相似的效果,您可以使用return

$arr = @(1..10)
$arr | ForEach-Object {
    if ($_ -eq 5){ return}
    "output $_"
}

答案 1 :(得分:6)

这是因为continue应用于foreach循环($ collection中的foreach $ item)而不是foreach-object cmdlet。试试这个:

$arr = @(1..10)
$arr | ForEach-Object {
    if ($_ -eq 5){ return}
    "output $_"
}

和此:

$arr = @(1..10)
 ForEach ($i in $arr) {
    if ($i -eq 5){ continue}
    "output $i"
}