素のJavaScriptからexeを実行する方法は以前やったが、やっぱりNode.jsから実行したい。
JavaScriptからexeを実行する
アウトプットは大事。
今回は、Node.jsからexeを実行する方法を調査した。
非同期実行:child_process.exec()
コマンドを非同期で実行する。実行結果はcallbackで受け取る。
シェルを生成し、そのシェル内でコマンドを実行して、生成された出力をバッファリングします。 exec関数に渡されるコマンド文字列はシェルによって直接処理されるため、特殊文字(シェルによって異なります)はそれに応じて処理する必要があります。
https://nodejs.org/api/child_process.html#child_process_child_process_exec_command_options_callback
Child process | Node.js v23.1.0 Documentation
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.exec()と同じです。タイムアウトが発生してkillSignalが送信されると、プロセスが完全に終了するまでメソッドは戻りません。子プロセスがSIGTERMシグナルをインターセプトして処理し、終了しない場合、親プロセスは子プロセスが終了するまで待機します。
https://nodejs.org/api/child_process.html#child_process_child_process_execsync_command_options
Child process | Node.js v23.1.0 Documentation
Sample
sample.exe
を実行する。
const execSync = require('child_process').execSync
const stdout = execSync('/sample.exe')
console.log(stdout)
まとめ
child_process.execSync()
を使っていたが、stderr
を受け取れないのが気に食わなくて調べていたら、
https://ja.stackoverflow.com/questions/28527/node-js-%E3%81%AE-execsync-%E3%81%AE%E6%88%BB%E3%82%8A%E5%80%A4%E3%81%A7-stderr-%E3%82%92%E5%8F%97%E3%81%91%E5%8F%96%E3%82%8B%E6%96%B9%E6%B3%95
stderr
が必要でしたら、例えばspawnSync
を使う方がよいと思います。
と、書いてある記事を見つけた。
Child process | Node.js v23.1.0 Documentation
stderr
以外に何が違うのか見れてないので、そのうち試してみる。