我有以下代码:
$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允许我们这样做?
发布于 2012-05-03 03:40:43
首先,Foreach-Object is a实际循环,在其中调用break将取消整个脚本,而不是跳到它后面的语句。
相反,在实际的foreach循环中,break和continue将按照您预期的那样工作。
在foreach循环中放置一个break确实会退出该循环,但它不会停止管道。听起来你想要这样的东西:
$todo=$project.PropertyGroup
foreach ($thing in $todo){
if ($thing -eq 'some_condition'){
break
}
}PowerShell允许您在foreach循环中修改该数组,但这些更改直到您退出循环后才会生效。试着运行下面的代码作为一个例子。
$a=1,2,3
foreach ($value in $a){
Write-Host $value
}
Write-Host $a我不能评论为什么PowerShell的作者允许这样做,但大多数其他脚本语言(Perl、Python和shell)都允许类似的构造。
发布于 2019-01-18 09:11:02
foreach和foreach-object之间存在差异。
你可以在这里找到一个非常好的描述:MS-ScriptingGuy
对于PS中的测试,这里有一些脚本来显示不同之处。
ForEach-Object:
# Omit 5.
1..10 | ForEach-Object {
if ($_ -eq 5) {return}
# if ($_ -ge 5) {return} # Omit from 5.
Write-Host $_
}
write-host "after1"# Cancels whole script at 15, "after2" not printed.
11..20 | ForEach-Object {
if ($_ -eq 15) {continue}
Write-Host $_
}
write-host "after2"# Cancels whole script at 25, "after3" not printed.
21..30 | ForEach-Object {
if ($_ -eq 25) {break}
Write-Host $_
}
write-host "after3"前置
# Ends foreach at 5.
foreach ($number1 in (1..10)) {
if ($number1 -eq 5) {break}
Write-Host "$number1"
}
write-host "after1"# Omit 15.
foreach ($number2 in (11..20)) {
if ($number2 -eq 15) {continue}
Write-Host "$number2"
}
write-host "after2"# Cancels whole script at 25, "after3" not printed.
foreach ($number3 in (21..30)) {
if ($number3 -eq 25) {return}
Write-Host "$number3"
}
write-host "after3"发布于 2014-12-25 01:15:02
要停止ForEach-Object所在的管道,只需在ForEach-Object下的脚本块中使用continue语句。当你在foreach(...) {...}和ForEach-Object {...}中使用continue时,它的行为是不同的,这就是为什么它是可能的。如果你想继续在管道中产生对象,丢弃一些原始对象,那么最好的方法是使用Where-Object过滤掉。
https://stackoverflow.com/questions/10277994
复制相似问题