2011-12-05 15 views
26

私はNodeJSの子プロセスを経由してWindows上でコマンドを実行しようとしています:それはti.stdin.writeを呼び出すと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); 

、それはstdin記述子にそれを書き込みますが、どのように私は、この時点で反応さcmdをトリガしますか?実際にコマンドプロンプトを入力しているときに行う「Enter」キー信号を送信するにはどうすればよいですか?現在、私はcmdからの応答を得ていません。

答えて

34

改行を送信すると、\nが実行されます。 .end()はシェルを終了します。

私はosxを使用しているので、bashで動作するように変更しました。

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 
24

あなただけのコマンドで行末(\ n)を送信する必要があります。

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

+1 @Raivo Laanemets - これはopの質問に対する実際の回答です。複数の読み込み/応答を処理するには、ある時点で 'stdin.end()'を呼び出す必要がありますが、改行で終了するだけです( '\ n'はWindows XP/7で動作します) –

+0

Ravioの答えはもっとです関連する – ShrekOverflow

4

ますいくつかの点でstdin.end()かを確認してください子プロセスは終了しません。

6

child_process execメソッドを使用できます。 ここに例があります:

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+']'); 
     } 
    }); 
関連する問題