执行child_process.spawn时保留颜色

pra*_*bir 64 node.js

我正在尝试使用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);
});
Run Code Online (Sandbox Code Playgroud)

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

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

Mit*_*tin 126

child_process.spawn()有新的'stdio'选项.试试以下:

spawn("path to executable", ["params"], {stdio: "inherit"});
Run Code Online (Sandbox Code Playgroud)

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

  • 效果很好!注意:像`spawnedThing.stdout.on`和`spawnedThing.stderr.on`这样的事件函数将不再存在,因为它继承了父代的写入流.我收到这个错误消息时,我已经花了一点时间意识到这一点:`无法调用'of null'的方法' (16认同)
  • 我有一个与Chris提到的问题有关的问题 - 我想在每行输出中添加一些自定义文本,所以我需要'on'函数,但是因为它们现在已经消失了,我怎么能保留原始输出颜色并预先添加一些东西到输出的每一行? (8认同)
  • 对于那些有 `Cannot call method 'on' of null` 错误的人......当你将 `stdio` 设置为继承时,你可以使用 `process.stdout.on`,因为在父进程中子进程正在继承 stdio。 (2认同)

fre*_*ous 15

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

const spawn = require('child_process').spawn;

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

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


Too*_*ate 10

试试这个:

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);
});
Run Code Online (Sandbox Code Playgroud)

请注意,无论是否customFds适用于Windows ,我都不肯定.我知道它旧的弃用功能不起作用,但当只[0,1,2]作为fd 传递时,我认为有一个特殊情况.

我一直在做类似的事情,但我只在Unix机器上运行该命令.所以让我知道这是否适用于Windows.


小智 10

如果您收到错误:

无法调用null的方法'on'

试试这个:

spawn("command", ["args"], { env : { FORCE_COLOR: true }});
Run Code Online (Sandbox Code Playgroud)

适用于摩卡

  • 模仿@KevinReilly,我做了 `{ env: { ...process.env, FORCE_COLOR: true } }` 使其成为一行。 (3认同)
  • 如果您收到错误"spawn node ENOENT",则此变体对我有用:`process.env.FORCE_COLOR = true; spawn("command",["args"],{env:process.env});` (2认同)

ska*_*ace 7

这并不能解决根本问题(缺乏适当的 TTY 流),但它应该有助于解决它。

如果您正在运行的子进程使用了​​ support-color ( https://www.npmjs.com/package/supports-color ) 像 chalk,那么您可以将环境变量设置FORCE_COLOR为任何值,它会跳过其余的支票。与inherit修复不同,这将允许您继续使用管道(并捕获/修改返回的数据)。

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