高見知英のかいはつにっし(β)

高見知英のアプリケーション開発日誌 のほか、地域活動などの活動報告ブログ。

WSHやVBAからコンソールを表示せずにコマンドラインプログラムを実行する

久々にプログラミングのお話で、今日は会社で面白いものを見つけたのでメモ。

WSH(cscriptではなく、wscriptを使った場合)やVBAから、WshShell.Execを使ってコンソールアプリを実行する場合、コンソールが表示されてしまいます。
そのための代替案として、WshShell.Runメソッドでcmd.exeを起動し、そのリダイレクト出力されたファイルを読んで処理する という方法が下記ページにて紹介されています。

以前こちらを読んだとき、知識が足りず内容が理解できなかったのですが、今日やっと理解できてついつい興奮してしまいました。


また、上のコードはただコンソールを表示しない他にも、呼び出し先のプログラムが内部処理にて停止しているときにも、こちらの処理が停止しない というメリットがあります*1
WSHはもう使われる機会も減っているかもしれませんが、VBAはまだ使っている人もいるでしょうし、アプリの内蔵スクリプトとしてのJScript/VBScriptもあるので、まだまだ用法はあるかなと。


ただ、上記サイトのコードでは、呼び出し先プログラム実行中は標準出力のリダイレクト用に作成したファイルに追記書き込みできないことを利用してアプリの終了待ちを実現しています。
ただ、この場合常時標準出力にデータを出力しているアプリを呼び出した場合問題はないのですが、もし呼び出し先アプリが一時的に標準出力への出力をやめてしまった場合、リダイレクトしているテキストファイルが追記可能になってしまい、呼び出し先プログラムが終了したと見なされる場合があります。

ちゃんと呼び出し先プログラムの終了を待つには、やはりプロセスを監視するなど別の方法をとった方がいいかも。


近いうちにGinnie用に作ってるライブラリにも手を入れてみようかと思っています。

*1:WshShell.Execの戻り値であるWshExec.stdOut.AtEndOfStreamなどで出力待ちを行うと、呼び出し先のプログラムが処理中にプログラムがWshExec.stdOutの出力を待ってしまい、一時的にプログラムの実行が止まってしまう