昔は気にしていたこともあったかな?2006年11月13日 09時25分05秒

行頭に sh-bang を入れて chmod で実行フラグを立てれば何でもコマンドとして実行できる Unix 風 OS と違って、Windows は拡張子が .exe か .bat か .com のファイルしかコマンドとして実行してくれない。それを見た目解決する為に Active State が Windows 版 Perl や Ruby に対して施している処置が、インストール時に拡張子の関連付けを行うということ。

しかし大谷氏のコメントにあるように、関連付けによるスクリプトの実行では標準入力のリダイレクトは行われず、これを行うようにするにはレジストリを弄るなどの対処が必要となる。

Windows NT 環境での開発の現場で自動テストに Perl を利用していたおいらとしては、あんまり新しくない情報なのですが、レジストリを弄る方法があるというのは知らなかったので一応メモ。でもそれ以前に、Windows が GUI ベースの OS である以上、ファイルのドラッグ&ドロップでスクリプトが起動できなきゃ使い勝手がいいとは言えないだろうとか思っちゃっているおいらとしてはあんまり役に立たない情報なのですが。。。

解決策は以下の 4 つ。

  1. 諦めて perl コマンドや ruby コマンドを書く。
  2. レジストリを弄る。
  3. バッチファイル化する。
  4. そもそも標準入力を使わない。

1 が一番まともな解決方法。 2 は、本格的な開発なんてやる気のない人が俺様環境だけで動いてくれりゃあいいと思って対処するなら別にそれでもいいんじゃないかなって感じ。 3 は、公開目的でちょっとしたものを「Windows でも動くよ」と言いつつ作る人向け。 Ruby でこれができるかどうかは知らんが、Perl ならば例えば以下のように書く (スクリプトのファイル名を script.bat とした場合)。

@rem = '
@echo off
perl script.bat %*
goto batchend
@rem ';

# ... detail of perl script ...

__END__
:batchend

もっと丁寧な書き方を知りたい人は、C:\Perl\bin\ ディレクトリ下にあるバッチファイルを眺めてみるといいと思う。NT でも Win9x でも動作するような書き方になっているからね。もっとも、この書き方の痛いところは、use strict プラグマが使えないのと、拡張子を .bat にしなきゃいけないこと。だから、Windows 以外の環境でも使えるクロスプラットフォームなプログラムを作りたい人や、テストをしっかりやりたい人にはオススメできない。おいらの場合、標準入力のリダイレクトよりも、ファイルをドラッグ&ドロップしてスクリプトを実行できるようにしたいという目的でやることがあるんだけど、大抵はこうは書かずにバッチファイルは別個に作っちゃうね \(^O^)/ 。

4 は実は一番堅実な方法なんだけれども、hacker な人は嫌がるだろうな。コマンドライン解析とかめんどくさいし。