Сохранять цвет при выполнении 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]()
Ответы
Ответ 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