Comment exécuter des commandes via le processus enfant NodeJS?

J'essaie d'exécuter des commandes sur Windows via des processus enfants 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);

Quand il appelle ti.stdin.write, Il l'écrit dans le descripteur stdin, mais comment puis-je déclencher cmd pour réagir à ce stade? Comment puis-je envoyer le signal de touche "Entrée" que vous faites lorsque vous tapez réellement dans l'invite de commande? Actuellement, Je ne reçois aucune réponse de cmd.

27
demandé sur Tower 2011-12-05 22:23:07

4 réponses

L'envoi d'une nouvelle ligne {[2] } exécutera la commande. {[3] } va quitter le shell.

J'ai modifié l'exemple pour travailler avec bash car je suis sur 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);

, La sortie sera:

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
35
répondu toabi 2015-07-06 16:45:31

Il vous suffit d'envoyer line end (\N) avec la commande:

setTimeout(function() {
    terminal.stdin.write('echo %PATH%\n');
}, 2000);
25
répondu Raivo Laanemets 2012-01-07 03:17:01

Vous pouvez utiliser la méthode child_process exec. voici un exemple:

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+']');
        }
    });
6
répondu cuixiping 2012-09-24 03:13:19

Assurez-vous que Vous stdin.end() à un moment donné ou le processus enfant ne quittera pas.

4
répondu kgilpin 2012-01-07 18:38:40