如何从函数的语句中退出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,continue而exit不是return但它终止了所有脚本..
回答
您的函数是高级函数,因此使用begin,process和end块。
在一个简单的(非高级)函数中,如果没有这样的块,return确实会立即退出函数,但是从这些块内部,return只是退出那个块。
(顺便说一句:break并且continue仅适用于类似循环的构造,并且exit旨在作为一个整体退出脚本,而不是单个函数)。
如果您想整体退出高级功能,您有两个基本选择:
-
使用一个语句抛出一个错误,
throw它会创建一个脚本终止错误(默认情况下是致命的)。- 要模拟二进制cmdlet 发出的语句终止错误,您可以使用该方法。
$PSCmdlet.ThrowTerminatingError()
- 要模拟二进制cmdlet 发出的语句终止错误,您可以使用该方法。
-
使用
[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 }
}
}