コマンド別解説

%1,%2…%X(引数とプレースホルダー)

>>argumentのオプション簡易解説へ

目次

 

引数(ひきすう)とは

引数(ひきすう)とは、バッチファイルのコマンドやプログラムに引き渡す文字列や数値のことを言います。

最も簡単な例として、以下は「echo」コマンドを使用して「argument」と表示するプログラムですが、これは「echo」コマンドに「argument」という文字列を引き渡しています。

この「argument」が引数です。

 

引数は一つだけではなく、複数指定することができます。

このように、コマンドに一番近い引数を「第1引数」と呼び、右に向かうにつれて「第2引数」、「第3引数」、…となります。

 

引数はコマンドだけではなく、バッチファイルにも引き渡すことができ、以下ではそれについて解説していきます。

 

プログラムで引数を参照する(プレースホルダー)

自身で作成したバッチファイルにも引数を指定することができます。

以下はバッチファイル「argument.bat」の実行時に文字列「arg」をバッチプログラムに引き渡しています。

 

以下は、バッチファイル「argument.bat」の内容です。プログラム内でこの引数を参照するには、「%1」を使用します

 

以下は「argument.bat arg」をコマンドプロンプト上で実行した結果です。

%1,%2...%X(引数とプレース フォルダー) argument.batの実行結果

「%1」に引数で指定した「arg」が入っていることが分かります。引数を受け取る「%1」のことを「プレースホルダー」と呼びます。

また、「%0」には実行したバッチファイル名が格納されることも追加で覚えておきましょう

 

複数の引数を引き渡すことも可能です。引き渡されるプレースホルダーは、

第1引数 → %1
第2引数 → %2
第3引数 → %3

第9引数 → %9

と対応しています。

以下は三つの引数をプログラムに引き渡し、引数を確認するバッチファイル「argument_multi.bat」です。

 

以下のコマンドをコマンドプロンプトへ打ち込んで結果を確認してみましょう。

以下、実行結果です。

%1,%2...%X(引数とプレース フォルダー) argument_multi.batの実行結果

この方法で引き渡せる引数は最大9個までです。10個以上の引数を引き渡し、参照する方法は次節で解説します。

 

10個以上の引数を指定する

10個以上の引数を使用する場合は少し複雑です。なぜなら、プレースホルダ―「%?」は9つまで(%9まで)しか利用できないためです。「%10」などはありません。

 

10個以上の引数を指定して参照する方法を解説します。

プログラムの実行は普段通り引き渡したい数の引数をバッチファイル実行時に指定します。以下、10つ以上の引数をバッチファイルへ引き渡した例です。

「1」~「13」 を引数としてバッチファイル「argument_multi_10.bat」に引き渡しました。

「1」~「9」までの引数をプログラム内で参照するには、通常通りプレースホルダー「%1」~「%9」を使用すればよいでしょう。

 

一方、プログラム上で、10番目以上の引数(「10」~「13」)を取得するには「shift」コマンドを使用します。以下、「argument_multi_10.bat」の内容を示します。

以下、実行結果です。

%1,%2...%X(引数とプレース フォルダー) argument_multi_10.batの実行結果

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...%X(引数とプレース フォルダー) argument_multi_10_2.batの実行結果

このバッチファイルでは仮想の配列(配列もどき)「arg[X]」というテクニックを使用しています。ループが回るたびに引数を格納する変数名を異なる名前にして過去の引数情報を上書きしないようにしているのです。これによって、ループから抜けた後も、「%arg[1]%」とすることで引数を参照できるようにしました。

これについては、「10つ以上の引数を指定する -やりたいことから検索-」で詳しく解説していますので、ここでは簡単に紹介する程度にしておきます。。仮想配列については、「バッチファイルで配列を使う -やりたいことから検索-」で詳しく解説しています。

 

スペースを含んだ引数を受け渡す

スペースを含んだ文字列を一つの引数として引渡したい場合があります。例えば、「yamada ichiro」、「tanaka hanako」といった二つの文字列を引数としてバッチファイル「argument_space.bat」に渡そうと思うと、

と書き、プログラム内で「%1」に「yamada ichiro」、「%2」に「tanaka hanako」を入れたいです。

しかし当然、プレースホルダーを確認すると、「%1, %2, %3, %4」 に「yamada, ichiro, tanaka, hanako」がぞれぞれ分けて入ってしまっています(下図)。

%1,%2...%X(引数とプレース フォルダー) argument_space_1.batの実行結果

これは、スペースが区切り文字として認識されるためです。

 

そこで、「%1」に「yamada ichiro」、「%2」に「tanaka hanako」を入れたいとき、すなわちスペースを含んだ引数はダブルクォーテーション「”」で囲みます

これで、上記のバッチファイル「argument_space_2.bat」 を実行するときちんと「%1」と「%2」に苗字と名前がセットになって代入されていることが分かります(下図)。

%1,%2...%X(引数とプレース フォルダー) argument_space_2.batの実行結果

 

しかし、表示をみると余分な「”」がついてしまっています。これを取り除くには、プログラム内で引数の呼び出しを以下のようにします。

このように、「%」と数字の間に「~」を加えることで自動的に「”」を取り除いてくれます。文字列の編集については、「パス名の文字列を自在に切り取る – やりたいことから検索 –」に詳しく解説していますので参考にして下さい。

 

区切り文字として扱われる記号

前節で区切り文字であるスペースを含んだ文字列の取り出し方を学びましたが、区切り文字はスペースだけではありません。以下の文字も区切り文字として扱われます。

セミコロン 「;」
カンマ 「,」
イコール記号 「=」

なので、

などと実行すると、「%1」には「x」、「%2」には「1」が入るので注意が必要です。「%1」に「x=1」とはなりません。

このような場合も、

として、参照するときは「%~1」を使用しましょう。

 

バッチファイル内から他のバッチファイルを呼び出すときに引数を指定する

「call」コマンドや「start」コマンドでバッチファイルからさらに別のバッチファイルを呼び出す場合にも、引数とプレースホルダーが使用できます。「call」コマンドや「start」コマンドについては「バッチファイルから別のバッチファイルを呼び出す – やりたいことから検索 –」をご覧下さい。

例えば、「main.bat」から「sub.bat」を呼び出すときに引数「arg1, arg2」を引渡したい場合は、「main.bat」内で、

とします。「sub.bat」でこの引数を参照するときはこれまでと同様に、「%?」を使います。

 

Windowsバッチファイル初心者へ向けた入門書を作成しました


Windowsバッチファイル初心者の方へ向けた入門書(PDF)を作成しました。


・初めてWindowsバッチファイルを勉強してみようと思っている方

・使ったことはあるが一から基礎を学び直したい方


へ向けて丁寧な解説を行っています。


「全くプログラムを知らない方でも、この入門書を読んだ後には、Windowsバッチファイルの中級者レベルになれるように」をコンセプトに執筆したものです。


この本を読めば、バッチファイルを使ったファイルやフォルダの操作に関しては一通りのことができるようになります。そうなればもう十分中級者と呼べるレベルですので、あとは自分のやりたいことを実現しようとする中で徐々に知識を蓄えていくだけですぐに上級者へなれるでしょう。


詳しくみる

関連ページ

コメントを残す