首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在PowerShell中退出ForEach-Object

如何在PowerShell中退出ForEach-Object
EN

Stack Overflow用户
提问于 2012-04-23 17:32:24
回答 10查看 273.4K关注 0票数 75

我有以下代码:

代码语言:javascript
复制
$project.PropertyGroup | Foreach-Object {
    if($_.GetAttribute('Condition').Trim() -eq $propertyGroupConditionName.Trim()) {
        $a = $project.RemoveChild($_);
        Write-Host $_.GetAttribute('Condition')"has been removed.";
    }
};

问题#1:如何退出ForEach-Object?我试着使用"break“和"continue",但不起作用。

问题#2:我发现我可以在foreach循环中修改列表...我们不能在C#中那样做...为什么PowerShell允许我们这样做?

EN

回答 10

Stack Overflow用户

回答已采纳

发布于 2012-05-03 03:40:43

首先,Foreach-Object is a实际循环,在其中调用break将取消整个脚本,而不是跳到它后面的语句。

相反,在实际的foreach循环中,breakcontinue将按照您预期的那样工作。

foreach循环中放置一个break确实会退出该循环,但它不会停止管道。听起来你想要这样的东西:

代码语言:javascript
复制
$todo=$project.PropertyGroup 
foreach ($thing in $todo){
    if ($thing -eq 'some_condition'){
        break
    }
}

PowerShell允许您在foreach循环中修改该数组,但这些更改直到您退出循环后才会生效。试着运行下面的代码作为一个例子。

代码语言:javascript
复制
$a=1,2,3
foreach ($value in $a){
  Write-Host $value
}
Write-Host $a

我不能评论为什么PowerShell的作者允许这样做,但大多数其他脚本语言(PerlPython和shell)都允许类似的构造。

票数 120
EN

Stack Overflow用户

发布于 2019-01-18 09:11:02

foreachforeach-object之间存在差异。

你可以在这里找到一个非常好的描述:MS-ScriptingGuy

对于PS中的测试,这里有一些脚本来显示不同之处。

ForEach-Object:

代码语言:javascript
复制
# Omit 5.
1..10 | ForEach-Object {
if ($_ -eq 5) {return}
# if ($_ -ge 5) {return} # Omit from 5.
Write-Host $_
}
write-host "after1"
代码语言:javascript
复制
# Cancels whole script at 15, "after2" not printed.
11..20 | ForEach-Object {
if ($_ -eq 15) {continue}
Write-Host $_
}
write-host "after2"
代码语言:javascript
复制
# Cancels whole script at 25, "after3" not printed.
21..30 | ForEach-Object {
if ($_ -eq 25) {break}
Write-Host $_
}
write-host "after3"

前置

代码语言:javascript
复制
# Ends foreach at 5.
foreach ($number1 in (1..10)) {
if ($number1 -eq 5) {break}
Write-Host "$number1"
}
write-host "after1"
代码语言:javascript
复制
# Omit 15. 
foreach ($number2 in (11..20)) {
if ($number2 -eq 15) {continue}
Write-Host "$number2"
}
write-host "after2"
代码语言:javascript
复制
# Cancels whole script at 25, "after3" not printed.
foreach ($number3 in (21..30)) {
if ($number3 -eq 25) {return}
Write-Host "$number3"
}
write-host "after3"
票数 28
EN

Stack Overflow用户

发布于 2014-12-25 01:15:02

要停止ForEach-Object所在的管道,只需在ForEach-Object下的脚本块中使用continue语句。当你在foreach(...) {...}ForEach-Object {...}中使用continue时,它的行为是不同的,这就是为什么它是可能的。如果你想继续在管道中产生对象,丢弃一些原始对象,那么最好的方法是使用Where-Object过滤掉。

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10277994

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档