Подтвердить что ты не робот

Сохранять цвет при выполнении child_process.spawn

Я пытаюсь выполнить команду windows через cmd.exe в node.js с помощью child_process.spawn. Он выполняется правильно, но отображает только цвет текста по умолчанию. Как сохранить цвет. Возможно ли это?

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 цвет не сохраняется. Executing via node.js

При непосредственном выполнении через cmd.exe цвет присутствует. (Это ожидаемое поведение). Как мне получить это поведение при выполнении через node. When executing through cmd.exe

4b9b3361

Ответ 1

Попробуйте это вместо:

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.

Ответ 2

Существует новая опция 'stdio' для child_process.spawn(). Попробуйте следующее:

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

"Наследовать" означает [0, 1, 2] или [process.stdin, process.stdout, process.stderr].

Ответ 3

кроссплатформенное решение, которое работало для меня, состояло в использовании как shell: true, так и stdio: 'inherit':

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

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

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

Ответ 4

Если вы получаете ошибку:

Невозможно вызвать метод 'on' null

Попробуйте следующее:

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

работает с mocha

Ответ 5

Это не устраняет основную проблему (отсутствие надлежащего потока TTY), но она должна помочь обойти ее.

Если подпроцесс, который вы используете, использует поддержку-цвет (https://www.npmjs.com/package/supports-color), как мел, тогда вы можете установить переменную FORCE_COLOR на любое значение, и она пропустит остальные проверки. Это позволит вам продолжать использовать каналы (и захватывать/изменять возвращенные данные) в отличие от исправления inherit.

Существует также модуль node -pty (https://www.npmjs.com/package/node-pty), который предоставляет .spawn возможность передать pty (pseudo tty), который может быть более целостным ответом. Я еще не играл с ним, и я не уверен, что это перекрестная платформа или нет.

Ответ 6

Если вы хотите сохранить цвет или добавить некоторые обозначения для вывода, вы можете попробовать код ниже:

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