バッチファイルを使おう(初心者向け・forコマンド基礎編)

繰り返し処理と言えばプログラムの真骨頂だと思います。人間の手で繰り返し同じ事をしようとすると、どうしてもミスは避けられません。バッチファイルにも繰り返し処理のコマンドが用意されており、使いこなすと非常に便利です。今回はバッチファイルの繰り返し処理である「forコマンド」を紹介します。

バッチファイルにおける繰り返し処理

少しだけバッチファイルでの繰り返し処理について説明します。バッチファイルの繰り返し処理は指定コマンドの繰り返し実行です。そして「forコマンド」というコマンドを利用して実行します。基本形を少し理解するだけで、幅広く利用できるのと、forコマンド自体にも色々な機能が用意されているので、深く理解することが出来れば強力な武器になります。理解が難しいという声が多いですが、覚えてしまえば簡単です。そして、覚えるには反復すれば大丈夫です。

forコマンドの基本形(%変数)

さっそくDOS先生に尋ねてみたいと思います。「help for」とコマンドプロンプトに入力してEnterキーを押下すると、とても長いお返事をDOS先生から頂きます。基本形はお返事の冒頭に記載しているので、まずはそこから見ていきましょう。

FOR %変数 IN (セット) DO コマンド [コマンドパラメーター]

初見だと、これだけ見ても少し分かりにくいですね。少しずつ解説します。まず、「%変数」は見ての通り変数を記述します。しかしながら何でも良いと言うわけではありません。DOS先生のお返事にも記載していますが、「単一文字の置き換え可能なパラメーターを指定します。」という制約があります。なので以下の様に記載します。

FOR %%a IN~

制約上、単一文字なのでアルファベット一文字を変数名にして下さい。でもちょっと待ってください。「%%a」って「%」が二つ並んでますよね。そうです。DOS先生のお返事の続きに「バッチ プログラムで FOR コマンドを使用するときは、%変数の代わりに、%%変数を使用してください。」と重要なことがしれっと書かれているのです。理由を詳細に説明すると長くなるので割愛しますが、端的に説明すると、バッチファイル内で「%」の文字を渡したい時には、「%%」とする必要があります。今はエスケープと近い感覚と考えて下さい。

forコマンドの基本形(IN (セット))

さて、変数の次は「IN (セット)」の部分です。

FOR %変数 IN (セット) DO コマンド [コマンドパラメーター]

DOS先生の文言だけでは少し解釈が難しいですが、解いていくとそれほど難しいものではありません。DOS先生のお返事の途中に記載があります。

FOR /L %変数 IN (開始,ステップ,終了) DO コマンド [コマンド パラメーター]
    セットは、ステップの量ごとに変化する開始から終了までの数列です。
    たとえば、(1,1,5) は 1 2 3 4 5、(5,-1,1) は (5 4 3 2 1) という数列になります。

何と言いますか、少しだけピンとくるような気がしませんか?恐らくですが、プログラムで言うところのFor文のインクリメントに似たような感じがしますね。「ステップ」を「インクリメント値」や「変化式」と言う具合に言いかえる、もっと言うと、javaのfor文の「++」だとイメージしやすいと思います。DOS先生も仰ってますが、例えば1から5まで1づつ加算する場合は、以下の様に記述することが出来ます。

FOR %%a IN (1,1,5) DO~

これでコマンドが5回繰り返されるという意味になります。また、このセットにはワイルドカードを使用することが出来ます。例えば、拡張子が「.csv」のファイルをセットに入れると以下の様に記述することが出来ます。

FOR %%a IN (*.csv) DO ~

これで、カレントディレクトリの拡張子「.csv」のファイルが発見されて走査が終了されるまで、繰り返し処理が実行されます。

forコマンドの基本形(DO コマンド)

ここは簡単です。実行したいコマンドを記載すればいいだけです。以下に例文を記載します。

@echo off

FOR %%a IN (*.txt) DO echo %%a

pause

とても簡単なFORコマンドです。拡張子「.txt」ファイルが発見されたらコマンドプロンプト上にファイル名が表示されます。尚、コマンドの直後にパラメータやスイッチを記載することも出来ます。簡単なForコマンドを作って試してみて下さい。

まとめ

今回はForコマンドの基礎中の基礎を紹介させて頂きました。変数は「%%a」と言うように「%%」を書いた後に一文字のアルファベットを記載します。セットの部分はプログラムのfor文のインクリメントと同じイメージで記載するか、ワイルドカードを使用して記載します。DOの後にはコマンドを記載すれば出来上がりです。