在循环中退出函数,如PowerShell中的Foreach-Object

时间:2014-07-23 22:08:16

标签: powershell

我在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
}

如果我突然离开循环,我基本上引入了一个哨兵变量。 有更清洁的解决方案吗?

2 个答案:

答案 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