如何从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
下面的脚本块中使用语句continue
。 continue
在foreach(...) {...}
和ForEach-Object {...}
使用它,这就是为什么它是可能的。 如果要在stream水线上继续生成对象,丢弃一些原始对象,那么最好的方法是使用Where-Object
过滤掉。
要在ForEach-Object
stream水线内“继续”,只需使用return
。 它会做你所期望的continue
:跳过块的其余部分,继续下一个迭代。