windows - ANSI 转义序列不会打印到 Windows 上的标准输出

标签 windows node.js terminal

我正在尝试在 Windows 上使用 node.js 将 ANSI 转义序列写入标准输出,但它似乎不起作用。

具体来说,我使用 ConEmu哪个support一个子集 ANSI 代码。我创建了一个测试文件,它应该重命名当前的控制台选项卡:

process.stdout.write('\x1b]9;3;"abc"\x1b\x5c');

但是,当我运行它时没有任何反应。如果我运行 node test > out.txt,正确的字节将写入输出文件。

为什么转义序列不起作用?

最佳答案

当 Node 的标准输出连接到非交互式接收器(即通过管道或重定向到文件)时,写入 process.stdout 的字节将按原样写入。因此,运行 node test > out.txt 会产生预期的结果。

但是,当 Node 连接到 Windows 中的交互式终端时,它(通过 libuv)实际上是 parses all ANSI escape codes这样它就可以使用 Windows API 透明地模拟 unix TTY 终端。这就是使颜色和重新定位光标等功能在 Windows 中起作用的原因,因为 Windows 控制台不支持 ANSI 转义序列。

未知和不受支持的序列被静默忽略。

因此,在 JS 调用 process.stdout.write() 和对 WriteConsoleW() 的内部调用( Node 实际输出到终端)。

这可以通过在 fd 1 上打开原始文件系统流从用户代码解决。

var rawStdout = new fs.SyncWriteStream(1, { autoClose: false });

将 ANSI 转义序列写入 rawStdout 将正确地发送到终端。

rawStdout.write('\x1b]9;3;"abc"\x1b\x5c');

(当然,这不会赋予 Windows 控制台任何神奇的新功能;它只会逐字打印序列,看起来像垃圾。您实际上必须使用某种支持 ANSI 转义码的终端仿真器。)


为了更好地实现我的特定目标,我最终编写了一个模块——console-title —通过在 unix 上编写 ANSI 转义序列并调用 appropriate native API 来更改控制台的标题在 Windows 下。这允许我在 Windows 的默认控制台窗口和模拟器(如 ConEmu)中更改标题。

关于windows - ANSI 转义序列不会打印到 Windows 上的标准输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27575929/

相关文章:

Ruby ARGF 和额外参数不稳定

macos - 我怎样才能摆脱这个 osascript 输出?

c++ - 使用 QT Creator 在 C++ 中播放视频

windows - Ruby 在 Windows 上崩溃

java - 从java运行带空格的cmd

R CMD 检查错误 : how to get rid of hidden files and directory in devel R package on windows?

node.js - Node Sass 找不到当前环境的绑定(bind) : Windows 64-bit with Node. js 6.x

node.js - Heroku + node.js : I have a server which uses multiple ports. 如何让 Heroku 分配它们?

node.js - Node 服务器中的 Express-rate-limit 与 NGINX

ruby-on-rails - 如何查看我的环境变量?