技術とか戦略とか

IT技術者が技術や戦略について書くブログです。

JavaScript:Node.jsから対話式の外部プログラムを実行(別ウインドウ立ち上げ)

Node.jsでは、"child_process"を呼び出すことで、標準出力や標準エラー出力を受け取ることができます。
しかし、この実行方法では、別ウインドウでプログラムを実行することができません。
具体的には、対話式のプログラムを実行するような場合に困ることになります。
(この実行方法で実行されたプログラムに標準入力を求める処理が存在する場合、その処理は無視されるため)
 
そこで、"child_process"でプログラムを直接実行せずに、Windowsのstartコマンドを介して実行したいプログラムを指定することで、別ウインドウでプログラムを実行することが可能になります。
ただし、プログラムの標準出力や標準エラー出力を取得できなくなる(startコマンドの標準出力・標準エラー出力に上書きされるため)ので、呼び出し元のJavaScriptとの連携を行いたい場合は、ファイル連携等の別の方法で連携を行う必要があります。
 
以下、C#のHelloWorldプログラムをNode.jsから実行する例です。
 
【サンプルプログラム】
・Script.js
// 標準出力や標準エラー出力は取得できないため、取得を省略
var exec = require('child_process').exec;
exec('start c:/tmp/Program.exe', function(err, stdout, stderr) {
})
 
【実行コマンド(.batから実行)】
・Script.bat
@echo off
node Script.js
pause
 
【実行結果】
Enterを押下するまでProgram.exeは終了しない。
(入力待ちの状態が継続される)

f:id:akira2kun:20201027001204j:plain

 
--------------------
 
余談
 
元々は、HTML+JavaScriptで作成したGUIから、既存のJava実行モジュール(CUI向け)を呼び出して色々できないか、というのを調べていました。
それを調べる過程で、Node.jsから対話式のプログラムを呼び出すと、標準入力を求める処理が無視される事象を発見したため、今回の記事を執筆しました。
 
ちなみに、元々調べていたことについてですが、Webブラウザからローカルの実行モジュールを呼び出すのはセキュリティ的に良くないため、簡単にはできないようになっていました。
スタンドアローン前提のプログラムで、GUIなら何でも良かったので、WindowsFormやSwing等のGUIフレームワークで検討することにしました。