将stdout和stderr重定向到文件和控制台

时间:2017-09-06 11:35:53

标签: powershell io-redirection

在powershell脚本中,我调用了一个程序,并希望将stdoutstderr重定向到不同的文件,同时仍在控制台中显示两者的输出。所以基本上,我想要

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,因为那时我会失去错误的视觉印象。

1 个答案:

答案 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