如何从PowerShell中的ForEach-Object退出

我有以下代码:

$project.PropertyGroup | Foreach { if($_.GetAttribute('Condition').Trim() -eq $propertyGroupConditionName.Trim()) { $a = $project.RemoveChild($_); Write-Host $_.GetAttribute('Condition')"has been removed."; } }; 

问题1:我如何退出ForEach? 我尝试使用“rest”和“继续”,但它不工作。

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

项目#1。 在foreach循环中放置一个break会退出循环,但不会停止pipe道。 这听起来像你想要这样的事情:

 $todo=$project.PropertyGroup foreach ($thing in $todo){ if ($thing -eq 'some_condition'){ break } } 

项目#2。 PowerShell可以让你在数组的foreach循环中修改一个数组,但是这些变化直到退出循环才会生效。 尝试运行下面的代码作为例子。

 $a=1,2,3 foreach ($value in $a){ Write-Host $value } Write-Host $a 

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

要停止ForEach-Object所属的pipe道,只需在ForEach-Object下面的脚本块中使用语句continuecontinueforeach(...) {...}ForEach-Object {...}使用它,这就是为什么它是可能的。 如果要在stream水线上继续生成对象,丢弃一些原始对象,那么最好的方法是使用Where-Object过滤掉。

要在ForEach-Objectstream水线内“继续”,只需使用return 。 它会做你所期望的continue :跳过块的其余部分,继续下一个迭代。