目次
10つ以上の引数を利用する
通常、バッチファイルに引き渡せる引数の最大値は9つです。これは、引数が代入されるプレースホルダーがの上限が9つまで「%1, %2,…%9」であることが原因であり、これは変更できません。しかし、「shift」コマンドをうまく利用すれば10以上の引数を読み込むことが可能です。
「shift」コマンドの役目は、引数を一つ前にズラすことです。一番若い引数(最も左側の引数)を消して、全体的に引数を左にスライドさせます。
バッチファイルを引数を指定して実行するとき、
1 |
[バッチファイル名] arg1 arg2 arg3 arg4 arg5 arg6 arg7 arg8 arg9 arg10 arg11 arg12 ... |
と入力しますが、これらの引数と対応するプレースホルダー「%1, %2,…%9」は、
引数 | arg1 | arg2 | arg3 | arg4 | arg5 | arg6 | arg7 | arg8 | arg9 |
プレースホルダー | %1 | %2 | %3 | %4 | %5 | %6 | %7 | %8 | %9 |
であり、9番目の引数(arg9)までしか格納できません。
ここで、「shift」を一回実行すると、
引数 | arg2 | arg3 | arg4 | arg5 | arg6 | arg7 | arg8 | arg9 | arg10 |
プレースホルダー | %1 | %2 | %3 | %4 | %5 | %6 | %7 | %8 | %9 |
となり、第1引数の「arg1」が消え、引数全体がスライドしました。これで始めは使えなかった引数「arg10」が「%9」に入るようになり使用可能になりました。
さらに、もう一度「shift」を実行すれば、
引数 | arg3 | arg4 | arg5 | arg6 | arg7 | arg8 | arg9 | arg10 | arg11 |
プレースホルダー | %1 | %2 | %3 | %4 | %5 | %6 | %7 | %8 | %9 |
となり、さらに「arg11」も使えるようになりました。
実際に試してみましょう。「arg1」から「arg12」までの引数を指定して、「shift」を3回実行し「%9」に「arg12」を代入してみます。
1 2 3 4 5 6 7 8 9 10 11 12 |
@echo off echo 初期状態の第9引数は「%9」です。 echo ちなみに、第1引数は「%1」です。 shift shift shift echo; echo 「shift」を3回実行後の第9引数は「%9」です。 echo ちなみに、第1引数は「%1」です。 |
以下、実行結果です。
配列にすべての引数情報を格納する(一般的な使い方)
前節のように、「shift」を使用していけば取得したい引数まで到達できます。しかし、その分だけ若い引数は削除され利用できなくなるので、全ての引数すべてを利用したいときは「shift」コマンドとループ文を用いて全ての引数を配列(もどき)に代入する方法がよく用いられます。
配列もどきについては、「バッチファイルで配列を使う -やりたいことから検索-」を参照下さい。配列もどきを使えば配列名をarray[?]と指定するだけで、
arg1 ⇒ array[1]
arg2 ⇒ array[2]
…
arg9 ⇒ array[9]
arg10 ⇒ array[10]
arg11 ⇒ array[11]
arg12 ⇒ array[12]
…
というようにarray[?]にすべての引数が入ってくれるため、いつでもすべての引数を使用できます。
以下が「shift」を利用して配列に全ての引数を代入するバッチファイルです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
@echo off if "%1"=="" goto :eof set count=1 :loop if "%1"=="" goto :confirm set array[%count%]=%1 set /a count+=1 shift goto loop :confirm echo 第1引数:%array[1]% echo 第2引数:%array[2]% echo 第3引数:%array[3]% echo 第4引数:%array[4]% echo 第5引数:%array[5]% echo 第6引数:%array[6]% echo 第7引数:%array[7]% echo 第8引数:%array[8]% echo 第9引数:%array[9]% echo 第10引数:%array[10]% echo 第11引数:%array[11]% echo 第12引数:%array[12]% |
3行目は引数がない場合は、プログラムを終了するコマンドです。
5行目からが配列「array[?]」に引数を格納していくコードになります。「set」コマンドで変数「count」に初期値1を代入しています。
6行目からはラベル「:loop」と「goto」を使ったループ文です。ループ文の中の7行目で引数があるかをチェックしあればループ内が実行されます。
8行目で配列「array[?]」に引数を代入します。始めは引数は%1ですので、array[1]に第1引数「arg1」が代入されます。
9行目で変数「count」に1を足します。
10行目で「shift」を実行すると、引数が左へスライドしますので第1引数が消えて、%1には第2引数(arg2)が入ります。
そして、ループの先頭に戻りarray[2]に第2引数「arg2」が格納されるという流れです。引数が無くなれば7行目でループから出ます。
最後に15行目以下ですべての引数がきちんと代入されたかを確認しています。
以下の実行例は12つの引数を指定した場合です。
10つ以上の引数がきちんと配列に代入されていることが分かります。