Shebang を処理するためには、
どこかのプログラムがまずはスクリプトを開き、
一行目を読んで処理系のパスを調べ、
そのパスにスクリプトを渡して起動する必要がある。

どこかのプログラムと言うのが、通常はシェルなのだが、
Windows では Apache などを介する必要があり面倒だ。

さて、専用のプログラムを作るのは簡単だが、
今日はあえてバッチファイルで作ってみよう。

バッチファイルは VBScript などと比較すると弱いが、
Windows 2000 以降、バッチファイルも強化されており、
簡単なスクリプトプログラムが書けるようになっている。

Shebang をコマンド上から呼び出すためのコマンド
shebang.cmd を作成することを考える。
呼び出しインタフェースは、
shebang <スクリプトファイル名> としよう。

では、バッチファイルの基本を作ろう。
まずは、引数がちゃんと渡ってるかどうか確認する。

========== d:\home\kes\shebang.cmd ==========

@echo off
rem # 上の行はおまじない。必ず最初に書く。

rem # バッチファイルのコメントは、rem から始まる行。
rem # rem というコマンドを実行する命令を書く感じだ。
rem # # は特に不要だが、何となくつけている。

rem # echo コマンドは、引数をそのまま画面に表示する。
rem # %1 は、バッチファイルの最初の引数を表す
echo 引数(そのまま): %1

rem # % と数値の後に ~ を指定した場合、
rem # 引数に対して特別な処理をすることを示す。
rem # ~ だけの場合は、引数の前後を区切る、
rem # ダブルクォートを取り除く効果がある。
echo 引数(クォート外し): %~1

rem # さらに文字を追加した場合、引数をファイル名とし、
rem # n はファイルの名前部分、x は拡張子、
rem # p はディレクトリ部分、d はドライブ名を表す。
rem # p はディレクトリ部分、d はドライブ名に分解する。
rem # 引数がパスを含まない場合でも補完される。
echo 引数(ドライブ名): %~d1
echo 引数(ディレクトリ): %~p1
echo 引数(ファイル名): %~nx1

===== end of d:\home\kes\shebang.cmd ==========

さて、コマンドプロンプトから実行してみよう。

D:\home\kes $ shebang script.cgi
引数(そのまま): script.cgi
引数(クォート外し): script.cgi
引数(ドライブ名): D:
引数(ディレクトリ): \home\kes\
引数(ファイル名): script.cgi

D:\home\kes $ shebang "C:\Program Files\Sample Script.cgi"
引数(そのまま): "C:\Program Files\Sample Script.cgi"
引数(クォート外し): C:\Program Files\Sample Script.cgi
引数(ドライブ名): C:
引数(ディレクトリ): \Program Files\
引数(ファイル名): Sample Script.cgi

こんな感じになった。