素のJavaScriptからexeを実行する方法は以前やったが、やっぱりNode.jsから実行したい。
今回は、Node.jsを使用して、Windowsの実行可能ファイル(.exe)を実行する方法には、主に非同期実行と同期実行の2つのアプローチがあります。以下にそれぞれの方法を詳しく説明します。
非同期実行:child_process.exec()
child_process.exec()
メソッドを使用すると、コマンドを非同期で実行できます。このメソッドは、コマンドの実行が完了したときにコールバック関数を呼び出します。
シェルを生成し、そのシェル内でコマンドを実行して、生成された出力をバッファリングします。 exec関数に渡されるコマンド文字列はシェルによって直接処理されるため、特殊文字(シェルによって異なります)はそれに応じて処理する必要があります。
https://nodejs.org/api/child_process.html#child_process_child_process_exec_command_options_callback
Sample
sample.exe
を実行する。
var exec = require('child_process').exec
var sample = function () {
exec('/sample.exe', function(err, stdout, stderr) {
if (stdout) console.log('stdout', stdout)
if (stderr) console.log('stderr', stderr)
if (err !== null) console.log('err', err)
})
}
sample()
同期実行:child_process.execSync()
child_process.execSync()
メソッドを使用すると、コマンドを同期的に実行できます。このメソッドは、コマンドの実行が完了するまで処理をブロックします。
child_process.execSync()メソッドは、子プロセスが完全に閉じられるまでメソッドが返されないことを除いて、一般にchild_process.exec()と同じです。タイムアウトが発生してkillSignalが送信されると、プロセスが完全に終了するまでメソッドは戻りません。子プロセスがSIGTERMシグナルをインターセプトして処理し、終了しない場合、親プロセスは子プロセスが終了するまで待機します。
https://nodejs.org/api/child_process.html#child_process_child_process_execsync_command_options
Sample
sample.exe
を実行する。
const execSync = require('child_process').execSync
const stdout = execSync('/sample.exe')
console.log(stdout)
引数を渡す
コマンドに引数を渡すことも可能です。例えば、sample.exe
に引数を渡す場合は、次のようにします。
const exec = require('child_process').exec;
exec('sample.exe arg1 arg2', (err, stdout, stderr) => {
// コールバック処理
});
プロセスの終了を待つ
非同期実行の場合、プロセスの終了を待つ必要がある場合は、exec
のコールバック内で処理を行います。同期実行の場合は、execSync
が完了するまで待機します。
spawn()メソッドの利用
exec()
やexecSync()
ではなく、spawn()
メソッドを使用することで、より細かい制御が可能です。特に、長時間実行されるプロセスや、ストリームデータを扱う場合に便利です。
const { spawn } = require('child_process');
const child = spawn('sample.exe', ['arg1', 'arg2']);
child.stdout.on('data', (data) => {
console.log(`stdout: ${data}`);
});
child.stderr.on('data', (data) => {
console.error(`stderr: ${data}`);
});
child.on('close', (code) => {
console.log(`子プロセスはコード ${code} で終了しました`);
});
このコードでは、sample.exe
を引数付きで実行し、標準出力と標準エラー出力をリアルタイムで受け取ります。
まとめ
Node.jsからexeを実行する方法は、exec()
、execSync()
、spawn()
の3つのメソッドがあります。それぞれのメソッドには特性があり、用途に応じて使い分けることが重要です。特に、エラー処理や引数の渡し方、プロセスの終了待ちなど、実際の使用シーンに応じた実装を心がけましょう。