是否有可能在一次运行中将stdout从外部程序重定向到外部程序的变量和stderr到另一个变量?
例如:
$global:ERRORS = @();
$global:PROGERR = @();
function test() {
# Can we redirect errors to $PROGERR here, leaving stdout for $OUTPUT?
$OUTPUT = (& myprogram.exe 'argv[0]', 'argv[1]');
if ( $OUTPUT | select-string -Pattern "foo" ) {
# do stuff
} else {
$global:ERRORS += "test(): oh noes! 'foo' missing!";
}
}
test;
if ( @($global:ERRORS).length -gt 0 ) {
Write-Host "Script specific error occurred";
foreach ( $err in $global:ERRORS ) {
$host.ui.WriteErrorLine("err: $err");
}
} else {
Write-Host "Script ran fine!";
}
if ( @($global:PROGERR).length -gt 0 ) {
# do stuff
} else {
Write-Host "External program ran fine!";
}
一个沉闷的例子,但我想知道这是否可能?
4 回答
一种选择是将stdout和stderr的输出组合成单个流,然后进行过滤 .
来自stdout的数据将是字符串,而stderr则生成System.Management.Automation.ErrorRecord对象 .
最简单的方法是使用stderr输出的文件,例如:
我还会使用$ LastExitCode来检查来自本机控制台exes的错误 .
您应该使用带有-RedirectStandardError -RedirectStandardOutput选项的Start-Process . 这个other post有一个很好的例子如何做到这一点(从下面的帖子中抽样):
这也是我用来重定向命令行的stdout和stderr同时仍然在powershell执行期间显示输出的替代方法:
只是补充已经给出的另一种可能性 .
请记住,这可能并不总是有效,具体取决于脚本的调用方式,从标准命令行而不是PowerShell命令行调用时,我遇到了-OutVariable和-ErrorVariable的问题:
在大多数情况下似乎有效的替代方案是:
不幸的是,在执行脚本期间,您将丢失输出到命令行,并且在命令返回后必须
Write-Host $stdOutAndError
使其成为"a part of the record"(就像运行Jenkins批处理文件的一部分一样) . 不幸的是,它没有将stdout和stderr分开 .