我在Powershell中有这样的功能:
function F()
{
$something | Foreach-Object {
if ($_ -eq "foo"){
# Exit from F here
}
}
# do other stuff
}
如果我在if语句中使用Exit
,它会退出powershell,我不想要这种行为。如果我在if语句中使用return
,foreach将继续执行,并且还会执行该函数的其余部分。我想出了这个:
function F()
{
$failed = $false
$something | Foreach-Object {
if ($_ -eq "foo"){
$failed = $true
break
}
}
if ($failed){
return
}
# do other stuff
}
如果我突然离开循环,我基本上引入了一个哨兵变量。 有更清洁的解决方案吗?
答案 0 :(得分:0)
任何帮助?
function F()
{
Trap { Return }
$something |
Foreach-Object {
if ($_ -eq "foo"){ Throw }
else {$_}
}
}
$something = "a","b","c","foo","d","e"
F
'Do other stuff'
a
b
c
Do other stuff
答案 1 :(得分:0)
我不完全确定您的具体要求,但我认为您可以通过不同的方式来简化这一点。看起来您只想知道是否 $something == "foo"
,在这种情况下,这会让事情变得更容易:
if($something ? {$_ -eq 'foo')) { return }
?是Where-Object的别名。这样做的缺点是,即使找到匹配项,它也会迭代数组中的每个项,所以......
如果您确实正在搜索字符串数组,事情会更简单:
if($something -Contains 'foo') { return }
如果迭代的阵列成本更高,您可以考虑实施一个允许您执行的equivalent of the LINQ "Any" extension method in Powershell:
if($something | Test-Any {$_ -eq 'foo'}) { return }
顺便说一句,虽然CLR中的异常不是that costly,但使用它们来指导程序流程is an anti-pattern,因为它可能导致难以遵循的代码,或者,正式地说,它违反了principal of least surprise。