在powershell脚本中,我调用了一个程序,并希望将stdout
和stderr
重定向到不同的文件,同时仍在控制台中显示两者的输出。所以基本上,我想要
stdout -> stdout
stdout -> out.log
stderr -> stderr
stderr -> err.log
到目前为止,我想出了这个代码,但不幸的是它只满足了要求1,2和4. Stderr没有打印在屏幕上。
& program 2>"err.log" | Tee-Object -FilePath "out.log" -Append | Write-Host
如何将stderr
打印到控制台?由于写入stderr
会产生红色字体,因此我不想将stderr
重定向到stdout
,因为那时我会失去错误的视觉印象。
答案 0 :(得分:3)
从this blog post获取提示,您可以编写一个自定义tee
函数,该函数按对象类型区分输入并写入相应的输出文件。像这样:
function Tee-Custom {
[CmdletBinding()]
Param(
[Parameter(
Mandatory=$true,
ValueFromPipeline=$true,
ValueFromPipelineByPropertyName=$true
)]
[array]$InputObject,
[Parameter(Mandatory=$false)]
[string]$OutputLogfile,
[Parameter(Mandatory=$false)]
[string]$ErrorLogfile,
[Parameter(Mandatory=$false)]
[switch]$Append
)
Process {
$InputObject | ForEach-Object {
$params = @{'InputObject' = $_}
if ($Append.IsPresent) { $params['Append'] = $true }
if ($_ -is [Management.Automation.ErrorRecord]) {
if ($ErrorLogfile) { $params['FilePath'] = $ErrorLogfile }
} else {
if ($OutputLogfile) { $params['FilePath'] = $OutputLogfile }
}
Tee-Object @params
}
}
}
可以像这样使用:
& program.exe 2>&1 | Tee-Custom -OutputLogfile 'out.log' -ErrorLogfile 'err.log' -Append