バッチファイルで.exeファイルを起動したときに、バッチファイル故にコマンドプロンプト画面が表示されます。
この黒いコマンドプロンプト画面の取り扱いについてちょっとしたTIPSのご報告です。
動機
今回試しにやってみたのはMeshCommander、インストール時にショートカットはスタートメニューに自動生成されますが、その他の箇所に作成したショートカットはバージョンアップの都度手動で再生成が必要になります。(2022年05月現在)
では、これをバッチファイル経由で起動したらどうだろうか、という試みを今回やってみたというのが発端です。
起動ファイルの場所
ショートカットのプロパティをみても元になるexeファイルが表示されないので、心当たりを探して見ることにしました。
C:\Program Files (x86)\Open Source\MeshCommander
にそれらしいファイル(nw.exe)を発見。
これを手動で起動してみると、MeshCommanderが起動してきました。これをバッチ化すればよさそう。
やってみる
単純にバッチファイルに以下のように、
--------------------------------------------------------------
MeshcommLunch.bat
--------------------------------------------------------------
@echo off
"C:\Program Files (x86)\Open Source\MeshCommander\nw.exe"
--------------------------------------------------------------
フルパスでexeファイルを記載してバッチを実行してみました。
これを実行してみると、
確かに起動するのですが、DOS窓の黒いコマンドプロンプト画面が同時に表示。MeshCommander起動中はこの黒い画面が表示されたままになります。
MeshCommanderを終了すると、
この黒い画面も自動的に閉じます。バッチファイルでexeファイルを起動しているので、exeファイルから呼び出された画面(プロセス)が終了するまでは、コマンドプロンプト画面も表示されたままになる、という動きをします。
この黒い画面をなしにできないかなぁと思って、以前に<VBSを使って画面非表示でバッチファイルを連続実行してみる - treedown’s Report>で.vbsファイル経由でバッチを起動して黒い画面を表示しないようにしたのですが、アプリ一つ起動するためだけに、こんな複雑な構成にするのもどうかなぁと思いました。
非同期実行なら
そこで、コマンドプロンプト画面は表示するけど、MeshCommander画面が起動中ずっと表示されていなければいいかな、と考えて、
MeshCommanderが起動した後にコマンドプロンプト画面が閉じればよい、ということにしました。
普通に起動しただけだと、MeshCommanderの終了を待つ(のでコマンドプロンプト画面が閉じない)のですが、これを待たずにMeshCommander起動後にコマンドプロンプト画面が閉じるようにすればいいんじゃないかということです。
非同期実行には、startコマンドを使ってexeファイルを実行します。startコマンドは元々別のウインドウ(画面)でコマンド実行結果を表示するときなどに使うコマンドで、そのためかstartコマンド経由で実行されたexeファイルは非同期実行となりコマンドの実行結果を待たずにプロンプトを返してくれます。
そのため、前述のバッチを変更して、
start "C:\Program Files (x86)\Open Source\MeshCommander\nw.exe"
と、実行してみたら、
ウインドウタイトルが「C:\Program Files (x86)\Open Source\MeshCommander\nw.exe」というカレントディレクトリのコマンドプロンプト画面がもう一つ起動するというコレジャナイ結果に。
※startコマンドは結構奥が深い。
そこで、あらかじめカレントディレクトリを移動しておき、startコマンドの引数はexeファイルだけにすれば、思った通りの動作になるだろうと考えて、以下のように修正しました。これで完成。
--------------------------------------------------------------
MeshcommLunch.bat
--------------------------------------------------------------
@echo off
pushd "C:\Program Files (x86)\Open Source\MeshCommander"
start nw.exe
popd
--------------------------------------------------------------
pushdを使ってカレントディレクトリを変更、startコマンドではカレントディレクトリ内にあるnw.exeを非同期実行するように指定します。
最後にpopdでpushdで移動したカレントディレクトリを戻る処理(pushdとpopdは1セットで使います。)を入れて終了。
これで思った通りの動作になり、
1) 一瞬だけコマンドプロンプト画面が表示される⇒すぐに消える
2) MeshCommander画面が起動する
という動作になりました。後はこのバッチファイルを好きなようにショートカットにして、常用する場所に置けば、完成です。
以上、ちょっとしたTIPSでした。