退出PowerShell函数但继续脚本

时间:2016-04-26 07:50:24

标签: function powershell exit

这似乎是一个非常非常愚蠢的问题,但我无法弄明白。我试图让函数在找到第一个匹配(匹配)时停止,然后继续执行脚本的其余部分。

代码:

Function Get-Foo {
    [CmdLetBinding()]
    Param ()

    1..6 | ForEach-Object {
        Write-Verbose $_
        if ($_ -eq 3) {
            Write-Output 'We found it'

            # break : Stops the execution of the function but doesn't execute the rest of the script
            # exit : Same as break
            # continue : Same as break
            # return : Executes the complete loop and the rest of the script
        }
        elseif ($_ -eq 5) {
            Write-Output 'We found it'
        }
    }
}

Get-Foo -Verbose

Write-Output 'The script continues here'

期望的结果:

VERBOSE: 1
VERBOSE: 2
VERBOSE: 3
We found it
The script continues here

我尝试过使用breakexitcontinuereturn,但这些都没有让我得到理想的结果。谢谢你的帮助。

2 个答案:

答案 0 :(得分:8)

如前所述,Foreach-object是其自身的功能。使用常规foreach

Function Get-Foo {
[CmdLetBinding()]
Param ()

$a = 1..6 
foreach($b in $a)
{
    Write-Verbose $b
    if ($b -eq 3) {
        Write-Output 'We found it'
        break
    }
    elseif ($b -eq 5) {
        Write-Output 'We found it'
    }
  }
}

Get-Foo -Verbose

Write-Output 'The script continues here'

答案 1 :(得分:1)

您传递给ForEach-Object的脚本块本身就是一个功能。该脚本块中的return只从脚本块的当前迭代返回。

您需要一个标志来告诉将来的迭代立即返回。类似的东西:

$done = $false;
1..6 | ForEach-Object {
  if ($done) { return; }

  if (condition) {
    # We're done!
    $done = $true;
  }
}

您可能最好使用Where-Object将管道对象过滤为仅需要处理的对象,而不是这样。