引数を10個以上行う方法:shiftコマンドの解説

shiftコマンドの使い方

バッチファイルで10個以上の引数を指定する方法は少し難しいです。9個までなら%1~9で指定すれば、できますが10個以上の場合はshiftコマンドを使用します。shiftコマンドは引数を1個ずつずらします。

例えば下記のように「あ~け」の引数をshiftコマンドでずらします。

引数
プレースホルダー%1%2%3%4%5%6%7%8%9

shiftで1回引数を伸ばすと下記のとおりになります。

引数
プレースホルダー%2%3%4%5%6%7%8%9%10

引数「あ」が%2になっていることがわかります。shift1回で1つずれ、2回で2つずれ・・・10回で10つずれます。実際に3回shiftを行ってみます。

例えば、下記のようにコードを作ります。

コード(shift.bat)

@echo off

echo 引数「%0」
echo 引数「%1」
echo 引数「%2」
echo 引数「%3」
echo 引数「%4」
echo 引数「%5」
echo 引数「%6」
echo 引数「%7」
echo 引数「%8」
echo 引数「%9」

shift
shift
shift

echo 以下は3回shift後の変数です。

echo 引数「%1」
echo 引数「%9」

コマンドプロンプトに「shift.bat あ い う え お か き く け こ さ し」の結果はこちら。三回ずれていることがわかります。%1が「あ」→「え」、%9が「け」→「し」になりました。

ですが、このやり方をすると、引数1、2、3が消えてしまいます。

次節では引数1を消さない方法は配列を使用し、行います。

はじめの引数を消さずに10個以上の引数を行うやり方

10個以上の引数を行いつつ、はじめの引数を残すやり方はラベルと四則計算を利用します。下記のコードを使えば、可能になります。ポイントはsub1:のラベルの中身です。

コード(shift2.bat)

@echo off 
set 数=1
 
:sub1
if "%1"=="" goto :sub2
set 引数[%数%]=%1
set /a 数+=1
shift

goto sub1
 
:sub2
echo 第1引数:%引数[1]%
echo 第2引数:%引数[2]%
echo 第3引数:%引数[3]%
echo 第4引数:%引数[4]%
echo 第5引数:%引数[5]%
echo 第6引数:%引数[6]%
echo 第7引数:%引数[7]%
echo 第8引数:%引数[8]%
echo 第9引数:%引数[9]%
echo 第10引数:%引数[10]%
echo 第11引数:%引数[11]%
echo 第12引数:%引数[12]%

個々のコードの解説をします。

@echo offは以下のコマンド処理を消すことです。詳しくはこちらのリンクを参考に。 

「set 数=1」は「数」という変数の中に「1」を入れるという意味です。

「:sub1」は「:sub1」というラベルを明記します。後ほど出てくる「goto」コマンドによって、ここまで戻ります。

「if “%1″==”” goto :sub2」を和訳すると「もし、%1が空白(“”)ならば、ラベル:sub2まで移動しろ。」となります。引数%1が何もなければ、ラベル:sub2に移動して処理をしなさいということです

「set 引数[%数%]=%1」で引数[%数%]という変数に%1を入れろという意味になります。ここでのポイントは「%数%」と「%1」です。「%数%」は先ほどのsetコマンドで「1」としましたが、次のコマンドで数字を足していきます。このため、ラベル:sub1に戻るときには1+1=2となり、一つずつずれていきます。

「set /a 数+=1」は四則計算で変数「数」に1つ足しています。

「shift」コマンドは前節で解説したとおり、引数を1つずらします。

「goto sub1」はラベル「sub1」に移動せよという意味です。この処理によって先ほどの四則計算やshiftによって、引数が1つずれています。

:sub2はラベルです。:sub2以下はechoのみですので、解説は省略します。

以上で解説を終えたので、コマンドプロンプトの結果はこちら。

しっかりと引数が1、2,3が消えずに12まで表示されていることがわかります。少し高度な技でしたが、バッチファイルでも引数を10個以上持たせることは可能です。

コメント

タイトルとURLをコピーしました