我有以下代码:
$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:我发现我可以在
循环...我们不能在C#中那样做...为什么PowerShell允许我们这样做?
发布于 2019-01-18 09:11:02
两者之间存在差异
和
..。
你可以在这里找到一个非常好的描述:
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
要停止其流水线,请执行以下操作
只需使用语句的一部分
下的脚本块内部
..。
当您在中使用它时,它的行为会有所不同
和在
这就是为什么它是可能的。如果您想继续在管道中生成对象,丢弃一些原始对象,那么最好的方法是使用
..。
发布于 2020-01-01 23:26:00
下面是对问题#1的建议方法,如果我希望使用ForEach-Object cmdlet,则使用该方法。它不会直接回答这个问题,因为它不会退出管道。然而,它在Q#1中可能会达到预期的效果,像我这样的业余爱好者唯一能看到的缺点是在处理大型流水线迭代时。
$zStop = $false
(97..122) | Where-Object {$zStop -eq $false} | ForEach-Object {
$zNumeric = $_
$zAlpha = [char]$zNumeric
Write-Host -ForegroundColor Yellow ("{0,4} = {1}" -f ($zNumeric, $zAlpha))
if ($zAlpha -eq "m") {$zStop = $true}
}
Write-Host -ForegroundColor Green "My PSVersion = 5.1.18362.145"我希望这是有用的。祝大家新年快乐。
https://stackoverflow.com/questions/10277994
复制相似问题