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

问题描述 投票:0回答:2

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

当我使用

command | tee output.txt
时,它根本不生成任何输出文件,但它在控制台中照常工作。

当我使用

command 2>&1 | tee output.txt
时,它会生成一个很好的输出文件,但控制台中的文本显示为红色。

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

powershell logging command-line command-line-interface
2个回答
8
投票

在 PowerShell 中,通过

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

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

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

%
的内置别名
ForEach-Object
):

... 2>&1 | % ToString | Tee-Object output.txt

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


2
投票

如果您在命令提示符中,那么您可以利用 powershell(从命令提示符)并使用 tee-object 或多或少地像在 POSIX shell 中一样执行 tee。

C:\> powershell some_command ^| tee-object -FilePath some_outputfile

^
转义管道,以便管道应用于powershell而不是命令提示符)

Powershell 和 tee-object 是 Windows 的标准配置,因此无需安装!

© www.soinside.com 2019 - 2024. All rights reserved.