概要
- シェルスクリプトの処理をバッチスクリプトでお願いします
- ついでにWindows側の環境はなるべく汚染させないようにお願いします
- Windows7〜10がターゲット
環境
バッチスクリプト用の環境は特に何もしなくて良いため、後はLL言語の環境を用意すれば良いという事で、
シェルスクリプトの処理を補完させるためにPerlを選択しました。
Windowsなので、ActivePerlをインストールして後は何もせずバッチスクリプトを起動させれば動くし、
利用者は最低限の労力でスクリプトの恩恵を得られるためこの選択は問題無いと判断してGOしました。
コードを書く
シェルスクリプト側の処理は、文字列の操作とか色々ある訳です。
その辺バッチスクリプトだけだと無理無理無理なので、バッチスクリプト起動時に渡されたコマンドライン引数から、ディレクトリを調べ、そのディレクトリ内にあるファイル一覧の内容をどうこうしたり、ファイル名の拡張子によって処理を変更したりというのを行うのをPerl側でやらせ、その結果を受け取って、また別の処理を〜…。というのを目指す事にしました。
自分が調べた感じだと、下記のように、FORを駆使してPerlのスクリプトを呼出し、その結果を変数に入れるという方法を取りました。
バッチスクリプトのコード
REM 例えばコマンドライン引数の1つ目が特定のディレクトリまでのパスだとして
SET TARGET_PATH=%1
REM TARGET_PATHをhoge.plに渡し、そこから得られた結果をHOGE_RESULTに代入
FOR /F "usebackq delims==" %%i IN (`perl scripts\hoge.pl %TARGET_PATH%`) DO SET HOGE_RESULT=%%i
Perlのコード
my $target_path = $ARGV[0];
# 何かしらの処理
$result = do_something();
print STDOUT $result;
こういった処理をひたすら書いていく事で、シェルスクリプトのコードをバッチスクリプトへ移行させられました。
環境構築が容易で、利用者に追加で沢山のインストールや時間を掛けず環境を構築しなければならないような時はこういうアプローチはありかなと思います。
(C#使うのもありですが、何をやるかに依る気がします。)
とりあえず今回はバッチスクリプトからこういう事をやる場合どうすればいいんだろうという事で調べてみてこうなったという事で終わりたいと思います。