Windows エクスプローラから Bash スクリプトを開いて実行したい
Windows 環境での自動化というと、Windows コマンドプロンプトや PowerShell を使うのが妥当だと思うが、GitBash (Git SDK) をインストールしているので、Bash でスクリプトを書きたいなーと思うこともある。WSL から Windows ホスト上に移動して作業しても良いのかもしれないが、何となくそれは気持ち悪い気がして避けている。
.bat
ファイルや .ps1
ファイルは、エクスプローラからダブルクリックすればスクリプトを実行できるので、同じ要領で、Windows のエクスプローラ上で .bash
ファイルをダブルクリックして、GitBash (Git SDK) で実行できたらいいなーと考えていた。
今回色々と試行錯誤して、それらしい技を編み出したので紹介する。
目次
- 1. 任意の Bash スクリプトを実行する Windows バッチファイル
- 2. 「GitBash」なウィンドウ (= MinTTY) で任意の Bash スクリプトを実行する Windows バッチファイル
- 3. コマンドプロンプトのウィンドウがチラつかないように GitBash ウィンドウを直接開く VBScript
1. 任意の Bash スクリプトを実行する Windows バッチファイル
最初に作ったのはこんな Windows バッチファイル。
exec-my-bash-script-1.bat
@C:\git-sdk-64\usr\bin\bash.exe --login -i -c '/c/Users/Neo/bin/my-bash-script.bash ; read'
@
でプロンプトを非表示にし、Git SDK 内の bash.exe
を使う (通常の GitBash を使っている人はパスを適宜書き換えること)。
あとは通常の bash
コマンドどおり、--login -i -c
で実行したいスクリプトファイルへのフルパスを渡す。
末尾に ; read
を入れているのは、実行後にウィンドウを開きっぱなしにしておきたいため。Enter を押せばウィンドウが閉じるようにしてある。
このようなバッチファイルを作ると、Windows コマンドプロンプト上で Bash スクリプトが実行される。実際の .bash
ファイルと別々にファイルを持つことになるが、とりあえずこのバッチファイルへのショートカットを用意しておけば、エクスプローラ上から好きな Bash スクリプトを実行できるだろう。
2. 「GitBash」なウィンドウ (= MinTTY) で任意の Bash スクリプトを実行する Windows バッチファイル
上のバッチファイルだと、Windows コマンドプロンプトのウィンドウで Bash が実行されるので、コンソール出力が味気ない。せっかくなら、いつも使っている GitBash のウィンドウ (git-bash.exe
を実行して開かれる MinTTY のウィンドウ) でスクリプトを実行したい。
色々調べてみたが、git-bash.exe
自体で任意のスクリプトを実行させるようなオプションはないっぽかった。調べてみると、以下の記事を見付けた。
コレを参考に編み出したのが以下のワンライナー。
exec-my-bash-script-2.bat
@C:\git-sdk-64\usr\bin\mintty.exe --icon C:\git-sdk-64\git-bash.exe --exec '/usr/bin/bash' --login -i -c '/c/Users/Neo/bin/my-bash-script.bash ; read'
- メインで実行するのは
C:\git-sdk-64\usr\bin\mintty.exe
。先程と同じく@
を付けて@Echo Off
相当のことをしておく - このまま開くとウィンドウのアイコンが MinTTY のモノになるので、
--icon C:\git-sdk-64\git-bash.exe
でアイコンを変える。コレは好みでw mintty.exe
に対して--exec '/usr/bin/bash'
オプションを渡すと、起動時にbash
が実行できる- あとはその
bash
コマンドのオプションとして--login -i -c
を書いていく
このバッチファイルを開けば、Bash スクリプトが実行されるウィンドウが GitBash のモノ (= MinTTY) になった。いつもの GitBash のウィンドウを開いて Bash スクリプトを実行した時と同じ UI になるだろう。
3. コマンドプロンプトのウィンドウがチラつかないように GitBash ウィンドウを直接開く VBScript
上のワンライナーで、MinTTY ウィンドウを開いて Bash スクリプトを実行できるようになった。
しかし、Windows バッチファイルである以上、.bat
ファイルを実行した直後に一瞬だけ「Windows コマンドプロンプト」のウィンドウが表示され、その後すぐに「MinTTY ウィンドウ」が開く、という挙動になる。
一瞬だけ開くコマンドプロンプトのウィンドウがチラついて鬱陶しい…そんな時は WSH だ!!
↑ コレの応用。
exec-my-bash-script-3.vbs
(拡張子が.vbs
)
WScript.CreateObject("WScript.Shell").Run "C:\git-sdk-64\usr\bin\mintty.exe --icon C:\git-sdk-64\git-bash.exe --exec '/usr/bin/bash' --login -i -c '/c/Users/Neo/bin/my-bash-script.bash ; read'"
上述のワンライナーを、WSH で実行するようにしている。WScript.CreateObject("WScript.Shell").Run
以降の内容は全く同じだ。もしも実行するコマンド内にダブルクォートを含む場合は、VBScript の書式に合わせて調整すること。
WSH (.vbs
) も、.bat
同様エクスプローラからダブルクリックで実行できるので、この VBScript へのショートカットを配置しておけばよかろう。
実行する Bash スクリプト内で read -p
なんかを使っていると、起動スクリプト中に書いた ; read
が上手く効かないことがある。原因がイマイチ分かっていないのだが、; read ; read
と、read
コマンドを2回連続で記入しておけば、確実に止められた。
以上。コレで Windows エクスプローラから Bash ファイルを直接実行できるようになった。2021年も WSH じゃ…。