ForEach-Object cmdlet不带-Parallel参数的情况下,它的实现是循环调用一个匿名函数,依次把管道传入的集合里的每个对象当作上下文来运行代码块。所以在代码块里使用return,退出的是当前这次调用,外层循环继续对下个传入对象调用匿名函数。下面是实验:
"A", "B", "C", "D" | ForEach-Object {
if ($_ -eq "C") {
Write-Host "嘿嘿嘿,C被我跳过啦!"
return
}
Write-Host $_
}
输出如下:
PS C:\Users\Curious\Desktop> .\test.ps1
A
B
嘿嘿嘿,C被我跳过啦!
D
综上,在ForEach-Object cmdlet的PROCESS代码块中使用return,脚本的行为类似于在for循环语句中的continue关键字。
PowerShell中不止有ForEach-Object这个cmdlet,还有foreach关键字,foreach作为关键字,行为和for是完全一样的,想达到提前进入下个循环项的目的,只能使用continue。代码如下:
"A", "B", "C", "D" | ForEach-Object {
if ($_ -eq "C") {
Write-Host "嘿嘿嘿,C被我跳过啦!"
return
}
Write-Host $_
}
$collection = "E", "F", "G", "H"
foreach ($currentItemName in $collection) {
if ($currentItemName -eq "G") {
Write-Host "呵呵,我也会跳过G。"
continue
}
Write-Host $currentItemName
}

本文探讨了在PowerShell的ForEach-Object cmdlet中使用return语句如何影响控制流。return在不带-Parallel参数的ForEach-Object中相当于for循环的continue,不会终止整个脚本,而是跳过当前循环迭代。同时,文章也提到了foreach关键字与for语句行为相同,若要提前进入下个循环项需使用continue。最后,文章提醒注意管道中使用foreach和%的隐式转换为ForEach-Object,并指出VSCode PowerShell插件对此会给出提示。
最低0.47元/天 解锁文章
847

被折叠的 条评论
为什么被折叠?



