目次
- 引数(ひきすう)とは
- プログラムで引数を参照する(プレースホルダー)
- 10 個以上の引数を指定する
- スペースを含んだ引数を受け渡す
- 区切り文字と扱われる記号
- バッチファイル内から他のバッチファイルを呼び出すときに引数を指定する
引数(ひきすう)とは
引数(ひきすう)とは、バッチファイルのコマンドやプログラムに引き渡す文字列や数値のことを言います。
最も簡単な例として、以下は「echo」コマンドを使用して「argument」と表示するプログラムですが、これは「echo」コマンドに「argument」という文字列を引き渡しています。
1 |
echo argument |
この「argument」が引数です。
引数は一つだけではなく、複数指定することができます。
1 |
[コマンド] 第1引数 第2引数 第3引数 第4引数 … |
このように、コマンドに一番近い引数を「第1引数」と呼び、右に向かうにつれて「第2引数」、「第3引数」、…となります。
引数はコマンドだけではなく、バッチファイルにも引き渡すことができ、以下ではそれについて解説していきます。
プログラムで引数を参照する(プレースホルダー)
自身で作成したバッチファイルにも引数を指定することができます。
以下はバッチファイル「argument.bat」の実行時に文字列「arg」をバッチプログラムに引き渡しています。
1 |
argument.bat arg |
以下は、バッチファイル「argument.bat」の内容です。プログラム内でこの引数を参照するには、「%1」を使用します。
1 2 3 4 |
@echo off echo 引数は「%1」です。 echo 実行されたプログラムは「%0」です。 |
以下は「argument.bat arg」をコマンドプロンプト上で実行した結果です。
「%1」に引数で指定した「arg」が入っていることが分かります。引数を受け取る「%1」のことを「プレースホルダー」と呼びます。
また、「%0」には実行したバッチファイル名が格納されることも追加で覚えておきましょう。
複数の引数を引き渡すことも可能です。引き渡されるプレースホルダーは、
第1引数 → %1
第2引数 → %2
第3引数 → %3
…
第9引数 → %9
と対応しています。
以下は三つの引数をプログラムに引き渡し、引数を確認するバッチファイル「argument_multi.bat」です。
1 2 3 4 5 6 7 |
@echo off echo 第1引数は「%1」です。 echo 第2引数は「%2」です。 echo 第3引数は「%3」です。 echo 実行されたプログラムは「%0」です。 |
以下のコマンドをコマンドプロンプトへ打ち込んで結果を確認してみましょう。
1 |
argument_multi.bat arg1 arg2 arg3 |
以下、実行結果です。
この方法で引き渡せる引数は最大9個までです。10個以上の引数を引き渡し、参照する方法は次節で解説します。
10個以上の引数を指定する
10個以上の引数を使用する場合は少し複雑です。なぜなら、プレースホルダ―「%?」は9つまで(%9まで)しか利用できないためです。「%10」などはありません。
10個以上の引数を指定して参照する方法を解説します。
プログラムの実行は普段通り引き渡したい数の引数をバッチファイル実行時に指定します。以下、10つ以上の引数をバッチファイルへ引き渡した例です。
1 |
argument_multi_10.bat 1 2 3 4 5 6 7 8 9 10 11 12 13 |
「1」~「13」 を引数としてバッチファイル「argument_multi_10.bat」に引き渡しました。
「1」~「9」までの引数をプログラム内で参照するには、通常通りプレースホルダー「%1」~「%9」を使用すればよいでしょう。
一方、プログラム上で、10番目以上の引数(「10」~「13」)を取得するには「shift」コマンドを使用します。以下、「argument_multi_10.bat」の内容を示します。
1 2 3 4 5 6 7 8 |
@echo off :LOOP set arg=%1 if ’%arg%’==’’ goto :eof echo %arg% shift goto :LOOP |
以下、実行結果です。
10個以上の引数を取り出せていることが分かります。
7行目の「shift」は引数を一つ右にずらすコマンドです。したがって、初期状態では「%1, %2, %3, …」には「1, 2, 3, …」と入っていますが、一度「shift」を呼び出すと右に一つずれて、「%1, %2, %3, …」に入っている値は「2, 3, 4, …」と変化します。以下は、「shift」コマンドを実行するたびに「%?」に代入されている引数が一つずつずれる過程を示しています。
「%1, %2, %3, …」⇔「1, 2, 3, …」
↓
「shift」を実行
↓
「%1, %2, %3, …」⇔「2, 3, 4, …」
↓
「shift」を実行
↓
「%1, %2, %3, …」⇔「3, 4, 5, …」
↓
「shift」を実行
↓
「%1, %2, %3, …」⇔「4, 5, 6,…」
↓
「shift」を実行
↓
…
4行目の「set」コマンドで変数「arg」に引数を代入しています。代入しているのは「%1」なので、初めのループでは第1引数の「1」が変数「arg」に入ります。そして、6行目の「echo」コマンドで変数「arg」の中身を表示します。
その後、7行目の「shift」コマンドが実行されるので、引数は一つずれて「%1」には「2」が入ります。したがって、2回目のループでは「%1」の「2」が表示されます。
その後もループ繰り返すごとに「shift」コマンドを毎回呼び出し、「%1」に入る引数を一つずつずらしていっているのです。
そして最後に、5行目では引数が無くなると「goto :eof」でループを出てプログラムを終了しています。
これで、10個以上の引数もバッチファイルプログラムの中で参照することが可能になりました。
しかし、バッチファイルの例では次のループに進んでしまうと変数「arg」は上書きされるため、前の引数が使えなくなってしまいます。例えば、「%1」に「12」が入っているとき、第1引数の「1」を利用することはできません。
そこで、以下のプログラムでは前の引数の情報も保持して、ループを抜けた後でも値を呼び出せるよう改良したものです。ここでは、配列という概念を使っています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
@echo off set /a count=1 :LOOP set arg=%1 if ’%arg%’==’’ goto :END_LOOP set arg[%count%]=%arg% set /a count=count+1 shift echo %arg% goto :LOOP :END_LOOP echo 第8引数は「%arg[8]%」です。 echo 第13引数は「%arg[13]%」です。 |
以下、実行結果です。
このバッチファイルでは仮想の配列(配列もどき)「arg[X]」というテクニックを使用しています。ループが回るたびに引数を格納する変数名を異なる名前にして過去の引数情報を上書きしないようにしているのです。これによって、ループから抜けた後も、「%arg[1]%」とすることで引数を参照できるようにしました。
これについては、「10つ以上の引数を指定する -やりたいことから検索-」で詳しく解説していますので、ここでは簡単に紹介する程度にしておきます。。仮想配列については、「バッチファイルで配列を使う -やりたいことから検索-」で詳しく解説しています。
スペースを含んだ引数を受け渡す
スペースを含んだ文字列を一つの引数として引渡したい場合があります。例えば、「yamada ichiro」、「tanaka hanako」といった二つの文字列を引数としてバッチファイル「argument_space.bat」に渡そうと思うと、
1 |
argument_space.bat yamada ichiro tanaka hanako |
と書き、プログラム内で「%1」に「yamada ichiro」、「%2」に「tanaka hanako」を入れたいです。
しかし当然、プレースホルダーを確認すると、「%1, %2, %3, %4」 に「yamada, ichiro, tanaka, hanako」がぞれぞれ分けて入ってしまっています(下図)。
これは、スペースが区切り文字として認識されるためです。
そこで、「%1」に「yamada ichiro」、「%2」に「tanaka hanako」を入れたいとき、すなわちスペースを含んだ引数はダブルクォーテーション「”」で囲みます。
1 |
argument_space_2.bat "yamada ichiro" "tanaka hanako" |
これで、上記のバッチファイル「argument_space_2.bat」 を実行するときちんと「%1」と「%2」に苗字と名前がセットになって代入されていることが分かります(下図)。
しかし、表示をみると余分な「”」がついてしまっています。これを取り除くには、プログラム内で引数の呼び出しを以下のようにします。
1 2 3 4 |
@echo off echo 第1引数:%~1 echo 第2引数:%~2 |
このように、「%」と数字の間に「~」を加えることで自動的に「”」を取り除いてくれます。文字列の編集については、「パス名の文字列を自在に切り取る – やりたいことから検索 –」に詳しく解説していますので参考にして下さい。
区切り文字として扱われる記号
前節で区切り文字であるスペースを含んだ文字列の取り出し方を学びましたが、区切り文字はスペースだけではありません。以下の文字も区切り文字として扱われます。
セミコロン 「;」
カンマ 「,」
イコール記号 「=」
なので、
1 |
agrument.bat x=1 |
などと実行すると、「%1」には「x」、「%2」には「1」が入るので注意が必要です。「%1」に「x=1」とはなりません。
このような場合も、
1 |
agrument.bat ”x=1” |
として、参照するときは「%~1」を使用しましょう。
バッチファイル内から他のバッチファイルを呼び出すときに引数を指定する
「call」コマンドや「start」コマンドでバッチファイルからさらに別のバッチファイルを呼び出す場合にも、引数とプレースホルダーが使用できます。「call」コマンドや「start」コマンドについては「バッチファイルから別のバッチファイルを呼び出す – やりたいことから検索 –」をご覧下さい。
例えば、「main.bat」から「sub.bat」を呼び出すときに引数「arg1, arg2」を引渡したい場合は、「main.bat」内で、
1 2 3 4 |
@echo off call sub.bat arg1 arg2 start sub.bat arg1 arg2 |
とします。「sub.bat」でこの引数を参照するときはこれまでと同様に、「%?」を使います。
1 2 3 4 |
@echo off echo 第1引数:%1 echo 第2引数:%2 |