2>&1 的正确用法 | 三通或 | 带 powershell 的 T 恤

Mad*_*ist 7 powershell logging command-line command-line-interface

我想在控制台中查看命令的输出并将其保存在文件中,因此我有以下两个选项:

当我以command | tee output.txt某种方式使用时,它根本不生成输出文件,但它在控制台中照常工作。

当我使用它时command 2>&1 | tee output.txt,它会生成一个很好的输出文件,但控制台中的文本显示为红色。 在此输入图像描述

有什么方法可以修复第一个选项或让文本照常显示在第二个选项中吗?我正在使用 Windows PowerShell (Windows 10),我使用它的程序是 liquibase 3.5.5。只是为了这很重要。

mkl*_*nt0 8

在 PowerShell 中,通过将 stderr 行从外部程序重定向到 PowerShell 的成功流,2>&1将这些行包装在[System.Management.Automation.ErrorRecord]实例中,以防捕获它们以进行进一步处理。

Windows PowerShell中,这些捕获的实例呈现为类似于 PowerShell 错误,这就是您看到红色输出的原因(相比之下,如果没有重定向,stderr 行将传递控制台,而不着色)。

一个简单的解决方法是将这些对象显式转换为字符串,从而输出原始行(PSv3+ 语法;为简洁起见,使用内置别名%ForEach-Object

... 2>&1 | % ToString | Tee-Object output.txt
Run Code Online (Sandbox Code Playgroud)

注意:在按需安装的跨平台PowerShell (Core) 7+版本中不再需要此解决方法,即使捕获的 stderr 行现在也始终呈现为字符串。

  • 重定向[所有流](https://devblogs.microsoft.com/scripting/understanding-streams-redirection-and-write-host-in-powershell/)(不仅是错误和输出/成功,还有警告、详细和调试) 可以通过 `*>&1` 实现。 (2认同)