执行 powershell 语句后检测错误

Posted

技术标签:

【中文标题】执行 powershell 语句后检测错误【英文标题】:Detecting error after a powershell statement is executed 【发布时间】:2017-04-28 11:52:22 【问题描述】:

我正在使用 powershell 运行 sqlplus,我希望 PowerShell 在脚本运行后检测是否有错误并执行一些操作,而不是我查看结果文件。

& 'sqlplus' 'system/myOraclePassword' '@Test' | out-file 'result.txt';

通常在DOS下,命令遇到错误时会出现%errorlevel%,不知PowerShell中是否有类似的东西?

当然,我可以自己阅读日志文件,但有时,事情太常规了,我可能会忘记。

我的 Test.sql:

select level from dual
connect by level<5;
select 10/0 from dual;
quit;

显然存在除以零错误。 result.txt 会捕获它,但我希望 powershell 也能检测到它

SQL*Plus:2017 年 4 月 27 日星期四 16:24:30 发布 12.1.0.2.0 生产 版权所有 (c) 1982、2014,甲骨文。版权所有。 上次成功登录时间:Thu Apr 27 2017 16:17:34 -04:00 连接到: Oracle Database 12c 企业版 12.1.0.2.0 - 64 位生产 具有分区、OLAP、高级分析和真实应用程序测试选项 等级 ---------- 1 2 3 4 从双选择 10/0 * 第 1 行的错误: ORA-01476: 除数等于零

powershell语句执行后会不会像DOS一样返回errorlevel?

我试过了:

& 'sqlplus' 'system/myOraclePassword' '@Test' | out-file 'result.txt';
if (errorlevel 1)
 write-host error;

else
 write-host ok;

但这导致语法错误?

errorlevel : 术语“errorlevel”未被识别为 cmdlet 的名称, 函数、脚本文件或可运行的程序。检查拼写 名称,或者如果包含路径,请验证路径是否正确并 再试一次。

在powershell中检查错误的正确方法是什么?

更新

我用过这个:

if ($LASTEXITCODE -ne 0 )
 
write-host error;

else
 
write-host ok;

【问题讨论】:

尝试用if ($LASTEXITCODE -eq 1)替换if (errorlevel 1) 您还需要将whenever sqlerror exit failure or whenever sqlerror exit 1 添加到SQL 脚本的顶部,否则SQL*Plus 将在退出时正常退出,并且shell 不会知道有什么问题。但是您只能真正获得成功/失败,而不是实际错误(此处为 1476)-您可以 exit sql.sqlcode 但大多数外壳程序会将其包装在 256 处,这没有帮助... Invoke an exe from PowerShell and get feedback on success or failure的可能重复 @AlexPoole:谢谢你,亚历克斯。知道了!!难怪 @AlexPoole:每当 sqlerror 退出失败到 sql 脚本顶部时,我很抱歉回到您的评论中。起初我认为它会解决问题,但仔细观察后,$LASTEXITCODE 仍然为 0,这意味着它要么没有收到来自 sql 的错误标志,要么 sql 不认为除以零是 sqlerror。你能帮我解释一下吗? 【参考方案1】:

由于您正在调用一个可执行文件,您可能需要检查$LASTEXITCODE 变量或sqlplus 的返回值。在 PowerShell 中,每个变量都有一个 $ 前缀。

【讨论】:

值得注意的是,如果他感兴趣的只是它是否“成功”(以零错误代码退出),而不是它退出的特定错误代码,他也可以测试$?,对于零错误代码(成功)将是$true,对于非零退出(失败)将是$false @Martin Brandi:$LASTEXITCODE 有效,但我应该检查什么值?如果sql本身抛出错误代码,如何捕获sqlplus的返回值? 您检查的值是由 sqlplus 命令/程序定义的 - 检查文档。它还应该告诉您在发生 SQL 错误时将返回什么。 @JeffZeitlin:在我的问题中是正确的,但最终,如果可能的话,我很想从 sql 脚本中捕获错误代码 @user1205746 - $LastExitCode 捕获最近运行的外部可执行文件的退出代码。如果您的 SQL 脚本被编写为在发生某种类型的 SQL 错误时以特定值退出,则该值将在 $LastExitCode 中找到,就像在经典批处理脚本中在 %ERRORLEVEL% 中一样。

以上是关于执行 powershell 语句后检测错误的主要内容,如果未能解决你的问题,请参考以下文章

Powershell编码原因导致部分代码不执行

Powershell编码原因导致部分代码不执行

Powershell编码原因导致部分代码不执行

Powershell编码原因导致部分代码不执行

如何使用批处理或PowerShell从文本文件中删除换行符

为自动执行设置 PowerShell 脚本