「バッチファイルを最小化して起動」

注意:この記事の内容は WindowXP で検証しました。他のバージョンでは違う結果になるかもしれません。

バッチファイルを起動するとコマンドプロンプトが起動します。よく使う場合、これが鬱陶しかったりしますね。ショートカットを作って、そのプロパティから設定することは可能ですが、ちょっち面倒くさい。

探してたらいい方法が見つかりました。以下の一行をファイルの先頭に加えて下さい。そのバッチファイル自身を最小化して実行できます。

@if not "%~0"=="%~dp0.\%~nx0" start /min cmd /c,"%~dp0.\%~nx0" %* & goto :eof

見通しよく書くと、以下のようになります。

@if not "%~0"=="%~dp0.\%~nx0" (
start /min cmd /c,"%~dp0.\%~nx0" %*
goto :eof
)

動作説明はかなり長いです。

参考:Windows Script Programming: 起動されたら自身のバッチファイルを最小化で起動し直すバッチファイル


この命令は「自分自身を最小化して起動する」ためのものです。start /min cmd /c,"%~dp0.\%~nx0" %* の部分が核になります。簡単に言うと start /min で新しいウィンドウを最小化して開きます。でもって cmd /c,"%~dp0.\%~nx0" の部分で、新しいバッチファイル(この場合は自分自身)を呼び出しています。ちなみに %* は元々のバッチファイルに与えられた引数全てを意味します。

ところで、普通に自分を呼び出してしまうと、呼び出した自分がまた自分を呼んで無限にウィンドウが開き続け、収拾がつかなくなります(生命とはそうしたものですが)。そうならぬように、ここでは初めの if not で制限をかけています。この条件を入れることで、起動したときにはそのまま自分自身を最小化して呼び出しますが、呼び出された子供は自分を呼び出さなくなります。

なぜそんなことが可能になるかは、ちょっと長い話。このバッチファイルが C:\test.bat だったとします。すると %~0 はもちろん C:\test.bat になり、%~dp0.\%~nx0C:\.\test.bat になります。

間に挟まっているドット . は親フォルダを表す記号です。なので今回のように間に ./ を挟んでも意味するところは同じになります。日本語で書けば「山田家の子供 = 山田家の子供の親の子供」になるようなものです。C:\.\.\.\test.bat と書いても同じですね(笑)。

ここでは自分自身を C:\.\test.bat という「変名」で呼び出すことで、次から %~0C:\.\test.bat になることを利用しているのですね。(かなり苦肉の策です)

最後の :EOFは元から定義されているラベルで、ファイルの末尾(End Of File)を表します。goto :EOFはファイルの末尾に飛ぶために、バッチが終了するのですね。C言語の「return」にみたいなものです。exit でも同じように動作しますが、こちらはコマンドプロンプトごと終了する命令なので、困る場合もあるかもしれません。

(なぜ cmd /c, という風にカンマが入るかは次の日記で……)