Powershell-错误处理(如果已调用Catch块,则不调用finally块)

Powershell-错误处理(如果已调用Catch块,则不调用finally块),powershell,Powershell,在Powershell中,它似乎总是执行Finally块。是否有一种方法可以告诉Powershell在Finally块中不执行语句(如果捕获块) 已经被处决了。下面的代码示例,如果已触发电子邮件,则我不希望powershell生成日志文件 Catch { $ErrorMessage = $_.Exception.Message $FailedItem = $_.Exception.ItemName Send-MailMessage -From xxxxxxxxxx Break } Finall

在Powershell中,它似乎总是执行Finally块。是否有一种方法可以告诉Powershell在Finally块中不执行语句(如果捕获块) 已经被处决了。下面的代码示例,如果已触发电子邮件,则我不希望powershell生成日志文件

Catch
{
$ErrorMessage = $_.Exception.Message
$FailedItem = $_.Exception.ItemName
Send-MailMessage -From xxxxxxxxxx
Break
}

Finally
{
$Time=(Get-Date).ToString('MM/dd/yyyy hh:mm:ss tt')
"This script made a read attempt at" +  "$d1" | out-file $logfile -append
}

我不赞成使用此代码,但要回答您的问题,是的,这样做是可能的

$badIdea = $true

try
{
    Write-Output "About to do something dumb."
    $ugh = 1 / 0;
    Write-Output "Did I do something dumb?"
}
catch
{
    Write-Output "Caught something dumb."
    $badIdea = $false
}
finally
{
    if ($badIdea -eq $true)
    {
        Write-Output "Performing finally..."
    }
    else 
    {
        Write-Output "Skipping finally..."
    }
}
代码按您所说的去做……您可以在任何地方使用条件语句

这将产生:

About to do something dumb.
Caught something dumb.
Skipping finally...
Finally子句的目的是始终执行,无论是否为异常 发生与否

因此,正如在一篇关于这个问题的评论中指出的那样,您通常只在try语句之后没有异常发生的情况下放置希望执行的代码


Catch处理程序中的break确保只有在没有发生异常的情况下才能到达try语句下面的任何代码——但请注意,break只是从任何封闭循环中中断出来——甚至跨越函数和脚本边界!;只有在没有封闭循环的情况下,中断才等同于退出封闭脚本。

这与“finally”的概念相反。听起来你的finally块应该在try块的末尾,我同意。也就是说,在finally中使用一些条件代码可能是有充分理由的。不知道确切的情况,很难说,但当然,这似乎与最后……继续……背道而驰。@KoryGill:没错,我们不知道确切的情况,但是,根据问题的措辞,我怀疑对基本面缺乏理解。谢谢你的评论。现在我知道如何重写代码了。Thanks@user664481:我建议关注答案中我不赞成使用此代码的部分-Kory的方法仅在不寻常的情况下才需要。