gpt4 book ai didi

powershell - 将 stdout 和 stderr 重定向到单独的文件时抑制 NativeCommandError 输出

转载 作者:行者123 更新时间:2023-12-03 08:02:19 26 4
gpt4 key购买 nike

我有以下文件:

测试.ps1

& e:\test.bat > stdout.txt 2> stderr.txt

测试.bat

@echo off
echo write to stdout
echo write to stderr >&2

当我像这样调用 test.ps1 时:

powershell -ExecutionPolicy bypass e:\test.ps1

输出文件如下所示:

stdout.txt

write argument to stdout

stderr.txt

test.bat : write to stderr 
At E:\test.ps1:5 char:1
+ & "$application" "$argument" > $stdout 2> $stderr
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (write to stderr :String) [], RemoteException
+ FullyQualifiedErrorId : NativeCommandError

There is an answer将 stdout 和 stderr 重定向到同一文件时,如何防止 NativeCommandError 输出写入文件,但写入不同文件时如何实现这一点?

最佳答案

补充 mklement0 的 helpful answer ,这是一个适用于 PowerShell 5 及更早版本的函数 Tee-StdErr,您可以在其之间链接以将 stderr 重定向到没有 NativeCommandError 的文件,同时将常规输出转发到下一个管道命令(或者如果使用>,则将其重定向到文件):

Function Tee-StdErr {
[CmdletBinding()]
param (
[Parameter(Mandatory)] [string] $Path,
[Parameter(Mandatory, ValueFromPipeline)] $InputObject
)

begin {
$file = if( $item = New-Item -Path $Path -Force ) {
[IO.StreamWriter]::new( $item.FullName )
}
}
process {
if( $InputObject -is [Management.Automation.ErrorRecord] ) {
# stringify error message and write to file
if( $file ) { $file.WriteLine( "$InputObject" ) }
}
else {
# pass stdout through
$InputObject
}
}
end {
$file | ForEach-Object Dispose
}
}

用法:

& .\test.bat 2>&1 | Tee-StdErr stderr.txt > stdout.txt

# Alternatively pipe stdout to other commands:
& .\test.bat 2>&1 | Tee-StdErr stderr.txt | Set-Content stdout.txt
  • 2>&1 将错误 (#2) 流与成功 (#1) 流合并,因此两者都可以通过下一个管道命令
  • Tee-StdErr 测试当前管道对象 ($InputObject) 是否为 ErrorRecord,如果是,则将其字符串化 ( "$_") 它并将其写入错误文件。否则,当前对象是成功流中的字符串,该字符串是使用 PowerShell 的隐式输出功能(只需命名变量即可输出它)传递的。

关于powershell - 将 stdout 和 stderr 重定向到单独的文件时抑制 NativeCommandError 输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73594401/

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