バッチファイルでPerlスクリプトを書く


Perlスクリプトによる実行ファイルを作るとき、Unix系OSでは拡張子が付けないことが多いのだが、Windowsでそれと同じことをやろうとしてもうまくいかない。Windowsではファイルの拡張子によってファイルタイプを判別するようになっているからだ。

Windowsで拡張子のないコマンド(勿論、バッチコマンドとかぶるコマンド名ではいけない)を実行しようとするとどうなるかというと、強制的に「.exe」「.com」「.bat」のどれかが補われる。Perlスクリプトの拡張子「.pl」のままじゃダメってことだ。

じゃあ拡張子「.bat」の中にPerlスクリプトを無理矢理埋め込めばいいんじゃないか?となるわけだ。

以下のファイルを「test.bat」という名前で保存して実行してみると……

#!/usr/bin/perl
use strict;
use warnings;
use Perl6::Say;
say "Hello World!";


perl1.png

当然、そのままではうまくいかない。そこでファイルにおまじない(ほとんどActivePerl付属スクリプトのパクリ)を追加する。

以下のファイルを「test.bat」という名前で保存する。

@rem = '--*-Perl-*--
@echo off
if "%OS%" == "Windows_NT" goto WinNT
perl -x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9
goto endofperl
:WinNT
perl -x -S %0 %*
if NOT "%COMSPEC%" == "%SystemRoot%\system32\cmd.exe" goto endofperl
if %errorlevel% == 9009 echo You do not have Perl in your PATH.
if errorlevel 1 goto script_failed_so_exit_with_non_zero_val 2>nul
goto endofperl
@rem ';
#!/usr/bin/perl
#line 15

use strict;
use warnings;
use Perl6::Say;
say "Hello World!";

__END__
:endofperl
@rem = vim:syn=perl

16行目~19行目がプログラムの本体だ。もう一度試してみよう。

perl2.png

ちゃんとうまくいった。もしPerlがインストールされていなければ、相応のメッセージを表示して終了する。

perl3.png

コメントを残す