gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 08:24:27 25 4
gpt4 key购买 nike

我有一个运行批处理文件的脚本。批处理文件引发一些错误,但运行成功。但是,当批处理文件引发错误时,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行成为 [string]数组元素(正如onw所期望的那样),而PS将stderr行转换为 [System.Management.Automation.ErrorRecord]实例。

然后,您可以 检查$stderr(或$output)变量中的成功/失败指示符子字符串-注意使用通配符 *,因为 -like始终与整个字符串匹配(与regex-matching -match运算符不同):
if ($stderr -like '*(0 failed)*') {
# ignore errors
} else {
# don't ignore errors
}

至于 ,您对的经历是:

when the batch file throws errors, the powershell script throws an error.



外部程序(包括批处理文件)在PowerShell的意义上不能引发错误;它们集成如下:
  • 他们的退出代码记录在$LASTEXITCODE中,如果满足以下条件,则$?设置为$True:$LASTEXITCODE0,否则是$False
  • 在常规控制台中,stderr输出将传递到控制台-未涂成红色-并且未登录$Error(错误的内存日志)。换句话说:stdout和stderr行的格式相同。
  • 不幸的是,ISE的行为有所不同,并且将stderr行显示为PowerShell错误,并且确实将它们记录在$Error中-请参见this GitHub issue

  • 因此,听起来好像您是从ISE运行的。
    此外,如果从ISE运行代码时 $ErrorActionPreference = 'Stop'生效,则第一个stderr行不仅会作为PowerShell错误出现,还会触发整个PowerShell脚本的终止。

    关于powershell - PowerShell中的错误处理-检查外部程序的错误输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45842560/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com