2012-12-01 7 views
14

別のスクリプトから実行したいスクリプトがあります。問題は、子スクリプト(プロセス)が続行する前にユーザー入力が必要であるということです。生成されたプロセスの標準ノードに書き込みますか?

var child = spawn('script'); 
child.stdin.setEncoding('utf8'); 
child.stdout.on('data', function (data) { 
    console.log(data.toString().trim()); // tells me to input my data 
    child.stdin.write('my data\n'); 
}); 

データを入力した後、子スクリプトは続行する必要がありますが、代わりにハングします。

解決策

実際、上記のコードは私の仕事です。子スクリプトでcommander.jsを使用して、ユーザーに処理を促します。ここで私は子供のスクリプトのプロンプトに応答する方法である:

child.stdout.on('data', function (data) { 
    switch (data.toString().trim()) { 
     case 'Username:': 
      child.stdin.write('user'); 
      break; 
     case 'Password:': 
      child.stdin.write('pass'); 
      break; 
    } 
}); 

supposeと同じことの仕事:

var suppose = require('suppose'); 

suppose('script') 
    .on('Username: ').respond('user') 
    .on('Password: ').respond('pass') 
.error(function (err) { 
    console.log(err.message); 
}) 
.end(function (code) { 
    console.log(code); 
    done(); 
}); 
+0

だけの思考:あなたがために 'stdin'を終了する必要があります応答するあなたのスクリプト?参照:http://nodejs.org/api/stream.html#stream_stream_end – skeggse

+0

ドキュメントから:end()経由でこのストリームを閉じると、子プロセスが終了することがよくあります。 - http://nodejs.org/api/child_process.html#child_process_child_stdin それは私が確認できる子プロセスを終了します。 – simo

答えて

11

あなたがパッケージsupposeを使用することができます。それはUnix Expectのようです。完全な開示、私は著者です。 Githubのページ上の例から

は、あなたはスクリプトそれの例を見ることができますNPM: https://github.com/jprichardson/node-suppose

例:

var suppose = require('suppose') 
suppose('script') 
.on(/\w*/).respond('my data\n') 
.end(function(code){ 
    console.log('Done: ' + code); 
}) 
+0

私の子スクリプトでは*と思っても*動作しないので、何らかの問題があるようです。子スクリプトで* commander.js *を使用して、ユーザーに操作を促します。たぶんこれはなんらかの問題です。 – simo

+0

最初のプロンプトで空白文字が一つ残っていましたが、これは* commander.js *に固有のものだと思います。とにかくあなたのモジュールは私のために働くので、あなたの答えに印をつけます。 – simo

関連する問題