Windows 批处理 - 如何在保留彩色文本的同时保存终端输出?

Joe*_*obs 8 windows terminal colors

有时终端中的程序输出是彩色的。例如 aria2:

aria2c https://superuser.com > z.txt
Run Code Online (Sandbox Code Playgroud)

输出文件如下所示:

08/13 03:42:27 [[1;32mNOTICE[0m] Downloading 1 item(s)

08/13 03:42:28 [[1;32mNOTICE[0m] Download complete: G:/LH/1/index.html
Run Code Online (Sandbox Code Playgroud)

命令的输出(不将输出重定向到文件)如下所示: 在此处输入图片说明

我注意到在 Mac OS 中可以使用 cat 显示带有颜色的输出

同样在 Linux 中,也可以在GNOME 终端中做到这一点

我尝试使用 type 和 cat (来自 GnuWin32),但它不起作用。

有什么解决办法吗?我已经 sed,我可以用它来将 ASCII 转义码(十六进制 1B)替换为“^ESC^”之类的东西

use*_*686 10

aria2c 确实保存了颜色——问题是你不能在你的 Windows 版本中查看它们。

macOS 和 Linux(即 GNOME 终端)都通过“ANSI 序列”使用格式,输出与实际文本混合——例如ESC [1;32m,aria2c 日志中的 表示“粗体和绿色”。

但是 Windows 控制台很长一段时间内都没有。如果程序想要在控制台窗口中使用颜色,它必须调用特殊的 Windows API 来实现这一点。如果程序只是将 ANSI 序列写入其输出——Windows 不会在意。(总的来说,它被称为“控制台窗口”而不是“终端窗口”实际上是有原因的。)

控制台 ANSI 序列支持仅在 Windows 10 中添加 - 首先在版本 1511 中,然后在 1607 中禁用,然后在 1909 中再次启用。看起来您的屏幕截图来自 Windows 8.1(或 Server 2012,也基于 8.1),因此您没有有这个功能。

但是,在您的情况下,颜色信息保存为 ANSI 序列,因为 aria2c 会自动在“Windows 控制台 API”和“ANSI”模式之间切换——它在写入控制台时使用 API,但在检测到其输出时写入 ANSI 序列一份文件。但是您将无法在 Windows 8 中仅使用type; 相反,您需要:

  • 升级到 Windows 10。内置控制台在 Windows 10 中具有 ANSI 支持,尽管微软的“Windows 终端”应用程序总体上要好得多。

  • 下载另一个可以理解 VT 序列的控制台应用程序——似乎 ConEmu 是 Cmd.exe 用户的热门选择。

    通过 Cygwin 安装 Xterm/Urxvt/GNOME 终端也是一种选择。如果您安装了“Windows 版 Git”,它带有 MinTTY,在这种情况下也可以使用。

  • 通过 SSH(例如 PuTTY)读取日志文件。甚至 Windows SSH 客户端通常都带有兼容 ANSI/VT 的终端仿真器。

  • 安装ANSICON hack,它通过钩子添加 ANSI 序列支持。

  • 通过“ANSI 艺术查看器”读取日志文件。这些旨在与 MS-DOS ANSI.SYS 兼容,因此它们通常支持一组有限的格式序列(通常只有 8 种颜色)并且完全缺乏 Unicode 支持,但它们会在紧要关头做到。

  • 使用 Cygwin 版本的“cat”——cygwin 运行时将根据需要自动将基于 cygwin 的程序输出的 ANSI 序列转换为 Windows 控制台 API 调用。