0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2021-04-08

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
引数がありません
続行するには何かキーを押してください . . .

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

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

ではまた!よい夢を!

0
2
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?