2011-12-05 10 views
26

Sto cercando di eseguire comandi su Windows tramite processi figlio NodeJS:Come eseguire i comandi tramite processo figlio 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); 

Quando si chiama ti.stdin.write, scrive al descrittore stdin, ma come faccio a innescare cmd reagire a questo punto? Come posso inviare il segnale chiave "invio" che fai quando stai effettivamente digitando il prompt dei comandi? Attualmente non ottengo risposta da cmd.

risposta

34

L'invio di una nuova riga \n visualizzerà il comando. .end() uscirà dalla shell.

Ho modificato l'esempio per lavorare con bash come sono su 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); 

L'output sarà:

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 
24

Devi solo inviare fine riga (\ n) con il comando:

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

+1 @Raivo Laanemets - questa è la risposta effettiva alla domanda dell'op. Mentre è necessario ad un certo punto chiamare 'stdin.end()' se si desidera elaborare più letture/risposte, si dovrebbe terminare con una nuova riga ('\ n' funziona su windows xp/7) –

+0

La risposta di Ravio è più pertinente – ShrekOverflow

4

Assicurati di stdin.end() ad un certo punto o l' il processo figlio non uscirà.

6

È possibile utilizzare il metodo exec child_process. ecco un esempio:

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+']'); 
     } 
    });