web-dev-qa-db-fra.com

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 qu'il réagisse à 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.

29
Tower

L'envoi d'une nouvelle ligne \n Exécutera la commande. .end() quittera 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
37
toabi

Il suffit d'envoyer la fin de ligne (\ n) avec la commande:

setTimeout(function() {
    terminal.stdin.write('echo %PATH%\n');
}, 2000);
26
Raivo Laanemets

Vous pouvez utiliser la méthode exec child_process. 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
cuixiping

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

4
kgilpin