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/Catch
或If/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错误处理