(ruby)(Windows)(shebang)(Windowsでもスクリプトの一行目でインタプリタを切り替える)

以前の記事 http://d.hatena.ne.jp/morakana/20130208/1360325232 のおさらい&ちょこっと改良版です
とりあえず以前の記事も目をお通ししてからご覧ください


 まずは以前と同じくshebangの解釈をするバッチファイルを作ります(NT系基準で書いてますので、9x系だと動かない可能性があります)
ファイル名:shebang.batエンコード:Shift-JIS、 フォーマット:DOS形式(CRLF)

@ECHO off IF NOT EXIST %1 ( ECHO File not found. GOTO END_OF_BAT ) SET /P FL=<%1 SET FL=%FL:^=\n% IF NOT "%FL:~0,2%"=="#!" ( ECHO shebang not found. GOTO END_OF_BAT ) ECHO ^<%FL:~2%^> ECHO. %FL:~2% %* :END_OF_BAT
以前のはスクリプトが「エンコーディングUTF-8、フォーマット:LF」で書かれていると動作がおかしくなってましたが
(Windowsバッチ処理は入力されてくる文字列が「Shift-JIS、CRLF」であることが前提で処理するのが原因)
今回は、「LF」を「CRLF」に置換する処理を入れているので、
スクリプトが 「UTF-8、LF」 で書かれていてもその問題は回避できるはずです、
とりあえずこのバッチファイルを適当なところに配置します
(個人的にはDLLファイルを「D:\DLL」に置いてパスを通しているので、そこに配置しました→「D:\DLL\shebang.bat」
ただ今回パスが通ったところに置きましたが、この shebang.batに関してはパスが通っていることが必須ではありません)


 今回は .rbファイルを shebang.bat に関連付けする方法を書きます(読み替えれば .pl なども可能なはずです)
通常行う関連付けをやろうとしても、たまにうまくいかないケースもあったので
直接レジストリをいじります(注意! レジストリの操作は各個人の責任で行ってください)

 まず現在の状況確認をします、レジストリエディタで
[HKEY_CURRENT_USER\Software\Classes\.rb]
[HKEY_CURRENT_USER\Software\Classes\rb_auto_file]
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.rb]
を確認し、有れば削除します
(おそらくここにゴミが残ってるとうまく動かなくなる場合の原因になるのではと個人的には考えてます)
レジストリエディタをいじるのが怖い(めんどい)場合は、削除用のレジストリファイルを作って実行します
ファイル名:unreg_assoc_rb.regエンコード:Shift-JIS、 フォーマット:DOS形式(CRLF)

REGEDIT4 [-HKEY_CURRENT_USER\Software\Classes\.rb] [-HKEY_CURRENT_USER\Software\Classes\rb_auto_file] [-HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.rb]

 続いて .rbファイルに対する assoc と ftype の設定を行います、ここでやりたいことは
1. assocコマンドで .rbファイルが何のファイルかを定義して(今回は 「RubyScript」であると定義します)
2. ftypeコマンドで RubyScriptを実行する場合どういう風に実行するのかを(つまりshebang.batに渡すように)定義します


 コマンドプロンプトを(念のため管理者権限で)起動し
assoc .rbを実行して .rb が 関連付けされている ftype を調べます
ftypeが設定されていた場合は ftypeの設定を確認します
assoc .rb.rb=rubyと返ってきたならftype rubyとします
assoc .rbで何の返答も無かった場合もとりあえずftype RubyScriptとしてすでに設定されてないかを確認します
ワンクリックインストーラとか手動で関連付けをしたことが一度も無いなら、おそらくどちらの値も設定されていないはずです
(環境は人それぞれですし)ここの設定を変えても特に問題がなさそうだったら、実際に設定を行います

 以下の二つのコマンドを実行します
assoc .rb=RubyScript
ftype RubyScript="(shebang.batへのフルパス)" "%1" %*
私の環境なら、ftypeの所はftype RubyScript="D:\DLL\shebang.bat" "%1" %*という感じですね
(設定した値をクリアしたい場合はassoc .rb=ftype RubyScript=とします)

 設定が成功していれば コマンドプロンプトで .rbファイル名を入れてEnterキーだけでスクリプトが実行されるようになりますし
shebangの解釈も行われるようになります、当然ですがshebangのパスの指定が間違ってると実行されません
(もしもrubyc:\ruby\bin\にあるならスクリプトの一行目は#!c:\ruby\bin\ruby -Ksなどになります)

 いろんな環境との整合性もあるので、組み合わせによっては思わぬ問題が発生する可能性は有ります
もしもやる場合は、くれぐれも個人の責任で行ってください