バッチファイルで10個以上の引数を扱う


Y子です。
バッチファイルの引数は9個まで」縛りをなんとかしよう、というお話です。
 わたしその縛り最近知りましたけどね 
今回は、(用途はさて置き)縛りを回避する方法をがんばってひねり出します。

概要

バッチファイルの引数が10個以上でも、すべての引数を読み取れるようにします。
バッチファイルにドロップするファイルが10個以上でも、すべてのファイルを処理対象にします。

コード

 挙動の確認

まず、引数取得変数(「%数字」形式の変数)の挙動を確認してみます。

argument_multi_test1.bat
@echo off

echo 0=%0 1=%1 2=%2 3=%3 4=%4 5=%5 6=%6 7=%7 8=%8 9=%9 10=%10 11=%11 12=%12

引数に、aからlまで12個のアルファベットを与えると…

> argument_multi_test1.bat a b c d e f g h i j k l

0=argument_multi_test1.bat 1=a 2=b 3=c 4=d 5=e 6=f 7=g 8=h 9=i 10=a0 11=a1 12=a2

まず%0には、バッチファイルのファイル名(argument_multi_test1.bat)が格納されます。これだけ特別ですね。
%1%9には、1番目から9番目までの引数aiが格納されます。

一方、10番目以降の引数j k lがどこかへ行ってしましました。
%10a0と表示されているので、どうやら%10に分割して解釈されてしまうようです。
%11%12も、%10と同様にaナントカという形になりました。
つまり、引数は10個以上設定しても怒られないものの、値が正しく取得できるのは9個まで、ということになります。

 shiftコマンドを試す

ここで、引数の順番をずらしてくれるshiftコマンドを試してみます。
先ほどのバッチファイルに、2行追加します。

argument_multi_test2.bat
@echo off

echo 0=%0 1=%1 2=%2 3=%3 4=%4 5=%5 6=%6 7=%7 8=%8 9=%9 10=%10 11=%11 12=%12
shift
echo 0=%0 1=%1 2=%2 3=%3 4=%4 5=%5 6=%6 7=%7 8=%8 9=%9 10=%10 11=%11 12=%12
> argument_multi_test2.bat a b c d e f g h i j k l

0=argument_multi_test2.bat 1=a 2=b 3=c 4=d 5=e 6=f 7=g 8=h 9=i 10=a0 11=a1 12=a2
0=a 1=b 2=c 3=d 4=e 5=f 6=g 7=h 8=i 9=j 10=b0 11=b1 12=b2

なんとshift後は、さっきはファイル名が入っていた%0に、1番目の引数aが格納されました。
%1以降もひとつずつズレて格納され、さっき取得できなかった10番目の引数jは、%9として取得できました。
これはもしかして、echo %1shiftを無限に繰り返せば、すべての引数を表示できてしまうということでは!?

 えぐい数の引数を扱えるようにする

ということで、引数が尽きるまで無限に繰り返すやつを作ってみました。

argument_multi.bat
@echo off

:label_top

rem 引数がなければ、最後に飛んで終了する
if "%~1"=="" (
  echo 引数がありません
  goto :label_bottom

rem 引数があれば、出力してシフトし、最初に戻る
) else (
  echo %~1
  shift
  goto :label_top
)

:label_bottom
pause

さっきと同じ引数を与えてみます。

> argument_multi.bat a b c d e f g h i j k l

a
b
c
d
e
f
g
h
i
j
k
l
引数がありません
続行するには何かキーを押してください . . .

12番目の引数lまで、全部出力されました!
では、このバッチファイルに、たくさんのファイルをドロップしてみると…

C:\work dir\test01.txt
C:\work dir\test02.txt
C:\work dir\test03.txt
C:\work dir\test04.txt
C:\work dir\test05.txt
C:\work dir\test06.txt
C:\work dir\test07.txt
C:\work dir\test08.txt
C:\work dir\test09.txt
C:\work dir\test10.txt
C:\work dir\test11.txt
C:\work dir\test12.txt
引数がありません
続行するには何かキーを押してください . . .

ドロップしたすべてのファイルのフルパスが表示されました。すてきです。
てことは… 昨日のアレ をアレすることができますね…ふむふむ。

おわりに

無限ループって、夢がありますよね。
ちょっと間違うと悪夢になりますが!

ではまた!よい夢を!