Powershell Try/Catch 或 If/Else 不适用于我的脚本

Posted

技术标签:

【中文标题】Powershell Try/Catch 或 If/Else 不适用于我的脚本【英文标题】:Powershell Try/Catch or If/Else is not working for my script 【发布时间】:2021-06-08 08:38:35 【问题描述】:

我有以下powershell 脚本,它从我的Jenkins 运行:

$sqlpackage = Start-Process -FilePath sqlpackage.exe -ArgumentList '/Action:Publish','/SourceFile:"Database Services\bin\Release\Database Services.dacpac"',"/TargetConnectionString:""Data Source=$Env;Integrated Security=True;Persist Security Info=False;Pooling=False;MultipleActiveResultSets=False;Connect Timeout=60;Encrypt=False;TrustServerCertificate=False;Initial catalog=$Target""",'/p:BlockOnPossibleDataLoss=True' -wait -PassThru -Credential $Cred -RedirectStandardOutput sqlstdout.txt -RedirectStandardError sqlstderr.txt
$sqlpackage.WaitForExit()
$sqlpackage

我尝试对Try/CatchIf/Else 使用以下选项,但到目前为止没有任何效果(它转到Else / Catch,即使脚本成功通过:

选项 1

$sqlpackage = Start-Process -FilePath sqlpackage.exe -ArgumentList '/Action:Publish','/SourceFile:"Database Services\bin\Release\Database Services.dacpac"',"/TargetConnectionString:""Data Source=$Env;Integrated Security=True;Persist Security Info=False;Pooling=False;MultipleActiveResultSets=False;Connect Timeout=60;Encrypt=False;TrustServerCertificate=False;Initial catalog=$Target""",'/p:BlockOnPossibleDataLoss=True' -wait -PassThru -Credential $Cred -RedirectStandardOutput sqlstdout.txt -RedirectStandardError sqlstderr.txt
$sqlpackage.WaitForExit()
$sqlpackage
if ($sqlpackage.LastExitCode -eq 0) 
    Get-Content sqlstdout.txt

else 
     echo "An error occurred $Error[0]"
     Get-Content sqlstderr.txt
     exit $sqlpackage.LastExitCode

选项 2

try

    $sqlpackage = Start-Process -FilePath sqlpackage.exe -ArgumentList '/Action:Publish','/SourceFile:"Database Services\bin\Release\Database Services.dacpac"',"/TargetConnectionString:""Data Source=$Env;Integrated Security=True;Persist Security Info=False;Pooling=False;MultipleActiveResultSets=False;Connect Timeout=60;Encrypt=False;TrustServerCertificate=False;Initial catalog=$Target""",'/p:BlockOnPossibleDataLoss=True' -wait -PassThru -Credential $Cred -RedirectStandardOutput sqlstdout.txt -RedirectStandardError sqlstderr.txt
    $sqlpackage.WaitForExit()
    $sqlpackage

catch
    echo "An error occurred $Error[0]"
    Get-Content sqlstderr.txt
    $LastExitCode = 1
    exit $LastExitCode 

你能帮我正确的语法吗?最终预期的行为是显示sqlstdout.txt,以防它通过,sqlstderr.txt,以防它失败+失败jenkins构建。

【问题讨论】:

"万一失败"你说的“失败”是什么意思? try/catch 只有在抛出异常时才会起作用。如果命令运行正常,但没有做你想做的事情,那么它没有多大用处。同样,使用LASTEXITCODE - 如果进程不返回非零代码,那么这也不起作用。您将需要找到一种可靠的方法来确定成功/失败并与之合作。 还将-ErrorAction Stop 添加到您的命令中 @boxdog 我很确定 Start-Process 返回 LASTEXITCODE 。 @怀疑论者,到底在哪里?顺便说一句,我刚刚找到了这个答案,你认为它对我的案子有帮助吗? ***.com/a/4146198/11705021 “你认为它对我的案子有帮助吗?” 不可能说,因为不清楚你的场景中发生了什么。有例外吗?返回什么退出代码? 【参考方案1】:

对于 OPTION 1,if 块条件中的属性应该是ExitCode,而不是LastExitCode

【讨论】:

以上是关于Powershell Try/Catch 或 If/Else 不适用于我的脚本的主要内容,如果未能解决你的问题,请参考以下文章

用powershell的try catch, 为啥try里面出现异常,catch 捕获不到呢?

powershell 使用Try / Catch进行Powershell错误处理

powershell 没有Try / Catch的Powershell错误处理

Powershell错误处理,try catch finally

Powershell 如何获取异常的名称

JavaScript里的try..catch和if...else有何区别啊