执行child_process.spawn时保持颜色

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

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); }); 

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

当通过cmd.exe直接执行时,颜色是存在的。 (这是预期的行为)。 在通过节点执行时如何获得这个行为。 通过cmd.exe执行时

试试这个:

 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。 我知道这是旧的弃用function不起作用,但只有传递[0,1,2]作为FD,我认为这是一个特殊的情况。

我在这里做了类似的事情 ,但是我只在Unix机器上运行这个命令。 所以让我知道,如果这在Windows上工作。

child_process.spawn()有新的“stdio”选项。 尝试以下方法

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

“inheritance”是指[0,1,2]或[process.stdin,process.stdout,process.stderr]。

为我工作的跨平台解决scheme是使用shell: truestdio: 'inherit'

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

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

这并没有解决潜在的问题(缺乏一个适当的TTYstream),但它应该帮助解决它。

如果您正在运行的子stream程使用支持颜色( https://www.npmjs.com/package/supports-color )(如粉笔),则可以将环境variablesFORCE_COLOR设置为任何值,并且将跳过其余的检查。 这将允许您继续使用pipe道(并捕获/修改返回的数据)不像inherit修复。

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

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

 var spawn = require('child_process').spawn, 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

如果您收到错误:

无法调用null的方法'on'

尝试这个:

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

与摩卡一起工作