NodeJS 内から、Windows プログラム WMIC.exe (Windows Management Instrumentation のクエリに使用) に問題があります。
wmic.exe プロセスを生成できますが、何も出力されず、入力も受け入れられません。ただし、stdin を null に設定すると、正しく実行され、出力が得られます。
var spawn = require('child_process').spawn;
var wmic = spawn('wmic', [], {stdio: ['ignore']});
wmic.stdout.on('data', function(data) {
console.log('Data received:' + data);
});
wmic.on('close', function(code) {
console.log('Spawned process ended with code: ' + code);
});
wmic.exe を対話的に使用したいと考えています。これはサポートされており、開いたままにしておくと、WMI クエリごとに繰り返し開始する必要がなくなります。他の人も wmic.exe で同様の問題を抱えていましたが、単一のクエリの出力のみをキャプチャしたかったため、標準入力が null であることは問題ではありませんでした。
アップデート
私が次のことをすると...
var spawn = require('child_process').spawn;
var wmic = spawn('wmic', []);
wmic.stdout.on('data', function(data) {
console.log('Data received:' + data);
});
wmic.stderr.on('data', function(data) {
console.log('Error! - ' + data);
});
wmic.on('close', function(code) {
console.log('Spawned process ended with code: ' + code);
});
wmic.stdin.end('cpu get caption /format:csv\n');
次に、実際に結果が返され、次のクエリの準備ができてプロンプトが返されますが、次にプロセスが終了し、.end() の後に .write() を使用できないことは明らかです。代わりに .write() に変更すると、プロセスはまったく応答せず、.end() の使用時に受け取る stdout "wmic:root\cli>" からのプロンプトも表示されません。
または
wmic.stdin.push(null);
wmic.stdin.write('cpu/n'); // Ctrl-Z aka Windows EOF control code
.end() 呼び出しの代わりに上記を使用すると、それも機能します。しかし、一定のデータを投げ続けないと、プロセスが終了するようです。
あるいは
wmic.stdin.write('cpu');
wmic.stdin.write('\x1a');
これも機能しますが、やはり、CPU の結果が返された後、wmic.exe プロセスは終了することを決定します。:/
ほとんど
var wmic = spawn('wmic.exe', [], {stdio: [process.stdin, 'pipe', 'pipe']});
これは機能します。プロセスが正しく起動するので、wmic.exe から wmic.stdout.on('data', fn) を介してプロンプトを受け取り、開いたままになります。ただし、コードを介して入力を送信することはできませんが、コマンド プロンプト ウィンドウに直接入力することはできます。入力したものはすべて正しく実行され、ノード スクリプトを介して出力されます。繰り返しますが、このパイプで動作するのは奇妙ですが、入力するのではなく、コードを介してコマンドを送信したいので、設定したものは役に立ちません。