[英]Error Handling in PowerShell - inspect error output from external programs
我有一个运行批处理文件的脚本。 批处理文件引发一些错误,但运行成功。 但是,当批处理文件引发错误时,powershell脚本将引发错误。
输出中包括“ 0失败”。 有没有一种方法可以检查代码中是否包含此消息,是否忽略所有错误?
这是一些伪代码,可能能够描述我要完成的工作。
$output = ./testrunner.bat
if ($output -Like "(0 failed)") {
# ignore errors
} else {
# don't ignore errors
}
不幸的是, 在变量中选择性地从外部实用程序(控制台应用程序)捕获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
总是匹配整个字符串(与regex-matching -match
运算符不同):
if ($stderr -like '*(0 failed)*') {
# ignore errors
} else {
# don't ignore errors
}
至于您所经历的 :
当批处理文件引发错误时,powershell脚本将引发错误。
外部程序(包括批处理文件)在PowerShell的意义上不能引发错误; 它们集成如下:
他们的退出代码记录在$LASTEXITCODE
和$?
如果$LASTEXITCODE
为0
,则设置为$True
,否则$False
。
在常规控制台 ,stderr输出通过控制台通过-红色不着色-在没有登录$Error
(在内存中的日志错误)。 换句话说:stdout和stderr行的格式相同。
不幸的是, ISE的行为有所不同, 并且将 stderr行显示为PowerShell错误,并确实将它们记录在$Error
-请参见此GitHub问题 。
因此,听起来好像您正在从ISE运行。
此外,如果从ISE运行代码时$ErrorActionPreference = 'Stop'
有效,则第一条stderr行不仅会作为PowerShell错误出现,还会触发整个PowerShell脚本的终止。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.