意外と知られていないけど、知っていると便利な FOR コマンド
たとえ GUI がウリの Windows であっても、そこで実際に IT プロとしての作業をし始めると、いちいちナントカ管理コンソールとかを開いて、 右クリックして・・・などと GUI ベースで作業するより、コマンドプロンプトから済ませたほうが速くて便利なことが多いです。
また速いだけでなく、コマンドをバッチファイルで書いておけば繰り返しても間違えない、自動化できる等の利点もあります。
このためコマンドはいろいろと覚えておくに越したことありません。
今回はなかなか便利、でも、昔からあるのに意外と知られていない FOR コマンドについて説明します。
FOR コマンドの使い方
FOR コマンドは様々なオプションをとるコマンドなので、具体例を示しながら FOR コマンドの使い方を説明します。
集合の要素それぞれの値を変数に入れ、コマンドを実行
次のコマンドを見てください。
> FOR %i IN (a b c d e) DO @echo %i
この実行結果は次のようになります。
> FOR %i IN (a b c d e) DO @echo %i a b c d e
FOR コマンドで、集合の要素それぞれの値を変数に入れ、コマンドを実行できます。ここでは IN の後の () 内の要素 (すなわち a, b, c, d, e の 5 つ) が順番に %i に代入されます。
そしてその代入ループのそれぞれで、DO 以下で指定したコマンドを実行します。ここでは @echo で %i を出力しています。
初期値、終了値、ステップ値を指定してコマンドを実行
オプション "/L" を指定することによって、初期値、終了値、ステップ値を指定してコマンドを実行できます。
> FOR /L %i IN (0,2,10) DO @echo %i
とすると、実行結果は次のようになります。
> FOR /L %i IN (0,2,10) DO @echo %i 0 2 4 6 8 10
変数 %i は 0 を初期値として 2 ずつ増加。終了値の 10 以下の間コマンド @echo %i (つまり、変数 %i を出力) を繰り返します。
コマンドの実行結果を変数に代入
次の例では、"dir /b" コマンドの実行結果 (つまり現在のディレクトリ内のファイル名を出力) 行毎に %i に値を代入します。
> FOR /F "usebackq" %i IN (`dir /b`) DO @echo %i
/F に続いて "usebackq" オプションを指定します。これでコマンドの区切りにバッククォート (`) を使用することを指定。 IN に続くカッコ内にはバッククォート内にコマンドを指定します。
実行結果は次のように %i にファイル名が代入されます。
> FOR /F "usebackq" %i IN (`dir /b`) DO @echo %i file1.txt file2.txt file3.txt
コマンドの結果をそのまま @echo で出力しているので、IN で指定したコマンドの実行結果そのものになっていますが、 DO 以降を書き換えて、出力結果を利用します。
ファイルの内容を出力
test.txt というテキストファイルに次の内容が書いてあるとします。
a1 b1 c1 d1 e1 a2 b2 c2 a3 b3
ここで FOR コマンドを利用して、ファイルの内容を利用する方法を紹介します。
> FOR /F %i IN (test.txt) DO @echo %i a1 a2 a3
行毎に内容を読み込みます。そして、それをデフォルトの区切り文字である空白で区切った最初の部分を変数 %i に代入しています。
> FOR /F "tokens=1,2" %i IN (test.txt) DO @echo %i %j a1 b1 a2 b2 a3 b3
tokens オプションで 1, 2 を指定することによって、区切られた部分の 1 番目と 2 番目の部分を変数 %i と %j に代入しています。
ここでいきなり %j という変数が出てきましたが、%i という変数を最初に指定したことで、次の変数は %j その次は %k という風に、 必要に応じてアルファベット順に使えるようになります。もしスタートが %i の代わりに %a を指定すれば、2番目、3番目の変数は %b, %c です。
> FOR /F "tokens=*" %i IN (test.txt) DO @echo %i a1 b1 c1 d1 e1 a2 b2 c2 a3 b3
トークンに * を指定すると、その先全部という意味になります。tokens として 1,2* とした場合の動きは次のようになります。
> FOR /F "tokens=1,2*" %a IN (test.txt) DO @echo %a %b a1 b1 a2 b2 a3 b3 > FOR /F "tokens=1,2*" %a IN (test.txt) DO @echo %a %b %c a1 b1 c1 d1 e1 a2 b2 c2 a3 b3
次に区切り文字を変更する方法を紹介します。
test.txt を次のように書き換えます。
a1 b1:c1 d1 e1 a2 b2:c2 a3 b3
セミコロンを追加しています。そこで次のコマンドを実行します。
> FOR /F "delims=:" %i IN (test.txt) DO @echo %i a1 b1 a2 b2 a3 b3
変数は %i のひとつしか指定していないのに、一行目に a1 と b1 が表示されています。
これはオプションでデリミター (区切り) をコロン : に指定しているためです。
デリミターの指定やトークンの指定オプションは、コマンドの出力結果などにも適用可能です。
FOR /F "usebackq tokens=1* delims=." %i IN (`dir /b`) DO @echo filename=%i, ext=%j filename=MYIMAGE, ext=jpg filename=test, ext=txt
以上、典型的な FOR コマンドの利用方法を紹介しました。この他にも FOR コマンドにはいろいろと応用方法があるので、 ヘルプなどで確認しておくと良いと思います。