Bash 上で直接実行できる Windows バッチファイルを作る

GitBash など、Windows 上で Bash を使っているとき、Windows バッチファイルを起動するには、cmd.exe から叩いてあげれば実行できる。

例えば以下のような空ファイルを作る create.bat があったとする。

@Echo Off
Type C:\Temp.txt
Exit /b

GitBash 上から叩くときは以下のように呼ぶ。

$ cmd.exe //c create.bat

で、今回はこれを、$ create.bat と叩くだけで実行できるようにする

GitBash から起動した時は、自己を cmd.exe 経由で起動し直し、Windows コマンドプロンプトから起動した時はその処理を無視する、そんな処理を書ければ良い。Bash におけるヒアドキュメントを利用して、以下のようにすることで実現できる。

: <<EOF
@Echo Off
Goto WINDOWS
EOF
exec cmd //c ${0//\//\\\\} $*
:WINDOWS
Type C:\Temp.txt
Exit /b

改行とコメントを入れるとこんな感じで動いている。

$ Bash から起動した時は「EOF」までの行がヒアドキュメントとして無視される
# cmd.exe が解釈する時は1行目がラベルになり、3行目の Goto で「:WINDOWS」ラベルに移動する
: <<EOF
@Echo Off
Goto WINDOWS
EOF

$ Bash から起動した時はこの行が実行される
exec cmd //c ${0//\//\\\\} $*

# cmd.exe はこのラベルに飛び、実処理を行って終了する
:WINDOWS
Type C:\Temp.txt
Exit /b