关于node.js:执行child_process.spawn时保留颜色

preserve color when executing child_process.spawn

我正在尝试使用child_process.spawn通过node.js中的cmd.exe执行Windows命令。 它可以正确执行,但仅以默认文本颜色显示。 如何保存颜色。 可能吗?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
var spawn = require('child_process').spawn,
    cmd    = spawn('cmd', ['/s', '/c', 'C:\\\\Windows\\\\Microsoft.NET\\\\Framework\\\\v4.0.30319\\\\MSBuild c:\\\\test.sln']);

cmd.stdout.on('data', function(data){
    process.stdout.write(data);
});

cmd.stderr.on('data', function(data){
    process.stderr.write(data);
});

cmd.on('exit', function(code){
    console.log(code);
});

通过节点执行时,不保留颜色。
Executing via node.js

直接通过cmd.exe执行时,会显示颜色。 (这是预期的行为)。 通过节点执行时如何获得此行为。
When executing through cmd.exe


child_process.spawn()有新的" stdio"选项。请尝试以下操作:

1
spawn("path to executable", ["params"], {stdio:"inherit"});

"继承"表示[0、1、2]或[process.stdin,process.stdout,process.stderr]。


对我有用的跨平台解决方案是同时使用shell: truestdio: 'inherit'

1
2
3
const spawn = require('child_process').spawn;

spawn('node', ['./child.js'], { shell: true, stdio: 'inherit' });

谢谢@ 59naga https://github.com/nodejs/node/issues/2333


如果出现错误:

Cannot call method 'on' of null

试试这个:

1
spawn("command", ["args"], { env : { FORCE_COLOR: true }});

与摩卡咖啡一起使用


尝试以下方法:

1
2
3
4
5
6
7
var spawn = require('child_process').spawn
  , command = 'C:\\\\Windows\\\\Microsoft.NET\\\\Framework\\\\v4.0.30319\\\\MSBuild c:\\\\test.sln'
  , cmd    = spawn('cmd', ['/s', '/c', command], { customFds: [0,1,2] });

cmd.on('exit', function(code){
    console.log(code);
});

请注意,我不太肯定customFds是否在Windows上运行。我知道它的旧功能已失效,但是当仅将[0,1,2]作为fd传递时,我认为有一种特殊情况。

我在这里做了类似的事情,但是我只在Unix机器上运行过该命令。因此,请让我知道这是否适用于Windows。


这不能解决潜在的问题(缺少适当的TTY流),但是应该可以解决该问题。

如果您正在运行的子流程使用粉笔等的support-color(https://www.npmjs.com/package/supports-color),则可以将环境变量FORCE_COLOR设置为任何值,并且它将跳过其余的检查。与inherit修复程序不同,这将允许您继续使用管道(并捕获/修改返回的数据)。

还有一个node-pty(https://www.npmjs.com/package/node-pty)模块,该模块为.spawn提供了传递pty(伪tty)的能力,这可能是更全面的答案。我还没有玩过它,我不确定它是否跨平台。


如果要保留颜色或为输出添加一些符号,可以尝试以下代码:

1
2
3
4
5
6
7
8
9
var spawn = require('child_process').spawn,
var stream = require('stream');
cmd = spawn('cmd', ['/s', '/c', 'C:\\\\Windows\\\\Microsoft.NET\\\\Framework\\\\v4.0.30319\\\\MSBuild c:\\\\test.sln'], { stdio: [process.stdin, process.stdout, 'pipe'] });
var customStream = new stream.Writable();
customStream._write = function (data, ...argv) {
        console.log('your notation');
        process.stderr._write(data, ...argv);
 };
cmd.stderr.pipe(customStream);

请注意,代码使用es6