PowerShell中的错误处理 - 检查外部程序的错误输出

时间:2017-08-23 14:28:47

标签: powershell error-handling

我有一个运行批处理文件的脚本。批处理文件会抛出一些错误,但运行成功。但是当批处理文件抛出错误时,powershell脚本会抛出错误。

输出中包含“0 failed”。有没有办法检查以检查代码是否包含此消息,如果确实如此,则忽略所有错误?

这是一些可能能够描述我想要完成的事情的伪代码。

$output = ./testrunner.bat 
if ($output -Like "(0 failed)") { 
    # ignore errors
} else {
    # don't ignore errors 
}

1 个答案:

答案 0 :(得分:1)

不幸的是,选择性地从变量中的外部实用程序(控制台应用程序)捕获stderr输出并不容易。

最简洁但有点模糊的方法是(PSv4 +):

# First, make sure that $ErrorActionPreference is at its default,
# 'Continue'

$stdout, $stderr = (./testrunner.bat 2>&1).Where({
  $_ -isnot [System.Management.Automation.ErrorRecord]
}, 'Split')

注意:如果您满足于在单个变量中收集组合 stdout / stderr输出,则该任务简化为:

$output = ./testrunner.bat 2>&1

请注意,两个方案中的变量都将包含 数组对象,这些对象表示各个输出 的集合:stdout行变为(正如onw所期望的那样)[string]数组元素,而PS将stderr行转换为[System.Management.Automation.ErrorRecord]个实例。

然后,您可以检查$stderr(或$output)变量的成功/失败指标子字符串 - 请注意使用封闭的通配符*,因为-like始终与整个字符串匹配(与正则表达式匹配的-match运算符不同):

if ($stderr -like '*(0 failed)*') {
    # ignore errors
} else {
    # don't ignore errors 
}

至于您的经历

  

当批处理文件抛出错误时,powershell脚本会抛出错误。

外部程序,包括批处理文件不能在PowerShell意义上抛出错误;它们整合如下:

  • 他们的退出代码记录在$LASTEXITCODE$?设置为$True $LASTEXITCODE0$False为其他。

  • 常规控制台中,stderr输出传递到控制台 - 以红色显示 - 已登录$Error(内存中的错误日志)。换句话说:stdout和stderr行格式化相同。

  • 不幸的是, ISE 行为不同, 打印stderr行,好像它们是PowerShell错误而 将它们记录在{ {1}} - 请参阅this GitHub issue

因此,听起来你是从 ISE 运行的。
此外,如果从ISE运行代码时$Error生效,则不仅第一个stderr行会出现PowerShell错误,而且会触发终止整个PowerShell脚本。