如何从函数的语句中退出powershell函数

我希望函数语句 ( begin, process, end)的返回也应该终止其所有语句,但这不会发生。

我有一个这样的测试功能:

function test($a) {
    begin { 
        Write-Host 'begin ' -NoNewline
        if ($a -like '*begin*') { return; } 
    }
    process {
        Write-Host 'process ' -NoNewline
        if ($a -like '*process*') { return; } 
    }
    end {
        Write-Host 'end' -NoNewline
        if ($a -like '*end*') { return; } 
    }
}

当我以这种方式运行它时:

'begin', 'process', 'end' | ForEach-Object {
    Write-Host "Try exit in $_ :`t" -NoNewline
    test $_
    Write-Host
}

然后我得到类似的结果:

Try exit in begin :     begin process end
Try exit in process :   begin process end
Try exit in end :       begin process end

但我希望函数的输出也终止它的其他语句,输出将是这样的:

Try exit in begin :     begin
Try exit in process :   begin process
Try exit in end :       begin process end

我怎么才能得到它?

我尝试使用break,continueexit不是return但它终止了所有脚本..

回答

您的函数是高级函数,因此使用begin,processend块。

在一个简单的(非高级)函数中,如果没有这样的块,return确实会立即退出函数,但是从这些块内部,return只是退出那个块

(顺便说一句break并且continue仅适用于类似循环的构造,并且exit旨在作为一个整体退出脚本,而不是单个函数)。


如果您想整体退出高级功能您有两个基本选择:

  • 使用一个语句抛出一个错误throw它会创建一个脚本终止错误(默认情况下是致命的)。

    • 要模拟二进制cmdlet 发出的语句终止错误,您可以使用该方法。$PSCmdlet.ThrowTerminatingError()
  • 使用[bool]忽略尝试(重新)进入process/其他块的自定义变量。

    • 注意的是,为了退出每个管道输入对象process有效地,这将是有帮助的,以便能够指示没有更多的输入,应提供上游命令。但是,从 PowerShell 7.2 开始,这不是一个选项,但已被提议作为GitHub 问题 #3821 中的未来增强功能。

为了说明使用[bool]变量的技术:

function test($a) {
  begin { 
    $done = $false
    Write-Host 'begin ' -NoNewline
    if ($a -like '*begin*') { $done = $true; return } 
  }
  process {
    if ($done) { return }
    Write-Host 'process ' -NoNewline
    if ($a -like '*process*') { $done = $true; return } 
  }
  end {
    if ($done) { return }
    Write-Host 'end' -NoNewline
    if ($a -like '*end*') { return } 
  }
}


以上是如何从函数的语句中退出powershell函数的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>