Y子です。
「バッチファイルの引数は9個まで」縛りをなんとかしよう、というお話です。
~~ わたしその縛り最近知りましたけどね ~~
今回は、(用途はさて置き)縛りを回避する方法をがんばってひねり出します。
#概要
バッチファイルの引数が10個以上でも、すべての引数を読み取れるようにします。
バッチファイルにドロップするファイルが10個以上でも、すべてのファイルを処理対象にします。
#コード
## 挙動の確認
まず、引数取得変数(「%数字
」形式の変数)の挙動を確認してみます。
@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番目までの引数a
~i
が格納されます。
一方、10番目以降の引数j k l
がどこかへ行ってしましました。
%10
はa0
と表示されているので、どうやら%1
と0
に分割して解釈されてしまうようです。
%11
~%12
も、%10
と同様にaナントカ
という形になりました。
つまり、引数は10個以上設定しても怒られないものの、値が正しく取得できるのは9個まで、ということになります。
## shiftコマンドを試す
ここで、引数の順番をずらしてくれる__shift
__コマンドを試してみます。
先ほどのバッチファイルに、2行追加します。
@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 %1
とshift
を無限に繰り返せば、すべての引数を表示できてしまうということでは!?
## えぐい数の引数を扱えるようにする
ということで、引数が尽きるまで無限に繰り返すやつを作ってみました。
@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
引数がありません
続行するには何かキーを押してください . . .
ドロップしたすべてのファイルのフルパスが表示されました。すてきです。
てことは… 昨日のアレ をアレすることができますね…ふむふむ。
#おわりに
無限ループって、夢がありますよね。
ちょっと間違うと__悪夢__になりますが!
ではまた!よい夢を!