Как запускать команды через дочерний процесс NodeJS? - PullRequest
29 голосов
/ 05 декабря 2011

Я пытаюсь запускать команды в Windows через дочерние процессы NodeJS:

var terminal = require('child_process').spawn('cmd');

terminal.stdout.on('data', function (data) {
    console.log('stdout: ' + data);
});

terminal.stderr.on('data', function (data) {
    console.log('stderr: ' + data);
});

terminal.on('exit', function (code) {
    console.log('child process exited with code ' + code);
});

setTimeout(function() {
    terminal.stdin.write('echo %PATH%');
}, 2000);

Когда он вызывает ti.stdin.write, он записывает его в дескриптор stdin, но как мне вызвать cmd, чтобы среагировать на этом этапе? Как мне послать сигнал «ввод», который вы делаете, когда вы действительно вводите в командной строке? В настоящее время я не получаю ответа от cmd.

Ответы [ 4 ]

37 голосов
/ 06 декабря 2011

Отправка новой строки \n приведет к выполнению команды. .end() выйдет из оболочки.

Я изменил пример для работы с bash, так как я нахожусь на osx.

var terminal = require('child_process').spawn('bash');

terminal.stdout.on('data', function (data) {
    console.log('stdout: ' + data);
});

terminal.on('exit', function (code) {
    console.log('child process exited with code ' + code);
});

setTimeout(function() {
    console.log('Sending stdin to terminal');
    terminal.stdin.write('echo "Hello $USER. Your machine runs since:"\n');
    terminal.stdin.write('uptime\n');
    console.log('Ending terminal session');
    terminal.stdin.end();
}, 1000);

Вывод будет:

Sending stdin to terminal
Ending terminal session
stdout: Hello root. Your machine runs since:
stdout: 9:47  up 50 mins, 2 users, load averages: 1.75 1.58 1.42
child process exited with code 0
26 голосов
/ 07 января 2012

Вам просто нужно отправить конец строки (\ n) командой:

setTimeout(function() {
    terminal.stdin.write('echo %PATH%\n');
}, 2000);
6 голосов
/ 24 сентября 2012

Вы можете использовать метод exec child_process. Вот пример:

var exec = require('child_process').exec,
    child;

child = exec('echo %PATH%',
    function (error, stdout, stderr) {
        if(stdout!==''){
            console.log('---------stdout: ---------\n' + stdout);
        }
        if(stderr!==''){
            console.log('---------stderr: ---------\n' + stderr);
        }
        if (error !== null) {
            console.log('---------exec error: ---------\n[' + error+']');
        }
    });
4 голосов
/ 07 января 2012

Убедитесь, что вы stdin.end() в какой-то момент, иначе дочерний процесс не завершится.

...