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

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

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

aria2c https://superuser.com > z.txt

输出文件如下所示:

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

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

我注意到在 Mac OS 中,可以使用 cat 显示彩色输出

在 Linux 中也可以这样做GNOME 终端

我尝试使用 type 和 cat(来自 GnuWin32),但没有作用。

有没有什么解决办法?我有 sed,我可以用它来将 ASCII 转义码(十六进制 1B)替换为类似“^ESC^”的内容

答案1

aria2c 做到了节省颜色——问题是您无法在您的 Windows 版本中查看它们。

macOS 和 Linux(即 GNOME 终端)都使用“ANSI 序列”进行格式化,这些序列与实际文本混合输出 - 例如,ESC [1;32maria2c 日志中的表示“粗体和绿色”。

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

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

就你的情况而言,颜色信息曾是但是,由于 aria2c 会自动在“Windows 控制台 API”和“ANSI”模式之间切换,因此它不会保存为 ANSI 序列 - 它在写入控制台时使用 API,但在检测到其输出将发送到文件时会写入 ANSI 序列。但您无法在 Windows 8 中仅使用 来查看它type;相反,您需要:

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

  • 下载另一个控制台应用程序了解 VT 序列——看来 ConEmu 是 Cmd.exe 用户的热门选择。

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

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

  • 安装安西康hack 通过钩子添加 ANSI 序列支持。

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

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

相关内容