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); }); |
通过节点执行时,不保留颜色。
直接通过cmd.exe执行时,会显示颜色。 (这是预期的行为)。 通过节点执行时如何获得此行为。
child_process.spawn()有新的" stdio"选项。请尝试以下操作:
1 | spawn("path to executable", ["params"], {stdio:"inherit"}); |
"继承"表示[0、1、2]或[process.stdin,process.stdout,process.stderr]。
对我有用的跨平台解决方案是同时使用
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); }); |
请注意,我不太肯定
我在这里做了类似的事情,但是我只在Unix机器上运行过该命令。因此,请让我知道这是否适用于Windows。
这不能解决潜在的问题(缺少适当的TTY流),但是应该可以解决该问题。
如果您正在运行的子流程使用粉笔等的support-color(https://www.npmjs.com/package/supports-color),则可以将环境变量
还有一个node-pty(https://www.npmjs.com/package/node-pty)模块,该模块为
如果要保留颜色或为输出添加一些符号,可以尝试以下代码:
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