windowsでのcmd.exeやbatファイルでのforのコマンドの使い方です。
この記事のコマンド例はcmd.exeでforコマンドを使うことを想定しています。なので、batファイルなどで利用する場合は、コマンド例を少し修正しなければいけません。
目次
オプションなしのfor文
コマンドプロンプトで実行する場合の基本的なfor文は
1 |
for %a in (a.txt b.txt c.txt) do echo %a |
であり、実行結果は
1 2 3 |
a.txt b.txt c.txt |
となる。
また、ワイルドカードを使用でき、例えばカレントディレクトリが
1 |
C:\linuxcommand\net\test_for |
であり、そして、カレントディレクトリからのディレクトリ構造が
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
C:. │ file_a.txt │ file_b.txt │ file_c.txt │ test.bat │ tree.txt │ ├─dir_1 │ dir1_filea.png │ dir1_fileb.png │ dir1_filec.jpg │ ├─dir_2 │ │ dir2_filea.html │ │ dir2_fileb.html │ │ │ ├─dir2_dirA │ │ dir2_dirA_filea.html │ │ dir2_dirA_fileb.html │ │ │ └─dir2_dirB │ dir2_dirB_file1.txt │ dir2_dirB_file2.txt │ └─dir_3 dir3_filea.js dir3_fileb.js |
のときに
1 |
for %a in (*) do echo %a |
を実行すると
1 2 3 4 |
file_a.txt file_b.txt file_c.txt test.bat |
とカレントディレクトリのすべてのファイルを表示でき、次に
1 |
for %a in (*.txt) do echo %a |
のように、inの次の括弧の中で対象の名前を指定して、実行すると
1 2 3 |
a.txt b.txt c.txt |
上のようにカレントディレクトリにあるすべてのtxtファイルを表示できる。
batファイルでfor文を使う場合
for文をbatファイルで用いる場合は
1 |
for %%a in (a b c) do echo %%a |
で%の代わりに%%と記述する。
for文の/Dオプション
for文の/Dオプションはディレクトリを指定するために用いる。上のディレクトリ構造で
1 |
for /d %a in (*) do echo %a |
を実行すると
1 2 3 |
dir1 dir2 dir3 |
と表示される。
for文の/Rオプション
for文の/Rオプションは基準となるディレクトリからファイルを検索し、その後に各サブディレクトリにあるファイルを走査する。同じように上のツリー構造で
1 |
for /r %a in (*) do echo %a |
を実行すると
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
C:\linuxcommand\net\test_for\file_a.txt C:\linuxcommand\net\test_for\file_b.txt C:\linuxcommand\net\test_for\file_c.txt C:\linuxcommand\net\test_for\test.bat C:\linuxcommand\net\test_for\dir_1\dir1_filea.png C:\linuxcommand\net\test_for\dir_1\dir1_fileb.png C:\linuxcommand\net\test_for\dir_1\dir1_filec.jpg C:\linuxcommand\net\test_for\dir_2\dir2_filea.html C:\linuxcommand\net\test_for\dir_2\dir2_fileb.html C:\linuxcommand\net\test_for\dir_2\dir2_dirA\dir2_dirA_filea.html C:\linuxcommand\net\test_for\dir_2\dir2_dirA\dir2_dirA_fileb.html C:\linuxcommand\net\test_for\dir_2\dir2_dirB\dir2_dirB_file1.txt C:\linuxcommand\net\test_for\dir_2\dir2_dirB\dir2_dirB_file2.txt C:\linuxcommand\net\test_for\dir_3\dir3_filea.js C:\linuxcommand\net\test_for\dir_3\dir3_fileb.js |
と表示される。
for文の/Lオプション
for文の/LのオプションはC言語の扱うfor文の使い方に似ている。
1 2 3 4 |
set start=1 set step=1 set end=10 for %a in (%start%,%step%,%end%) do echo %a |
を実行すると
1 2 3 4 5 6 7 8 9 10 |
1 2 3 4 5 6 7 8 9 10 |
さらに、
1 |
for /L %a in (%start%,%step%,%end%) do echo file%a.txt |
を実行すると
1 2 3 4 5 6 7 8 9 10 |
file1.txt file2.txt file3.txt file4.txt file5.txt file6.txt file7.txt file8.txt file9.txt file10.txt |
のように表示される。また、
1 |
for /L %a in (1,1,10) do echo %a |
のように数字を直接入力することも可能である。
for文の/Fオプション
for文の/Fのオプションは、ファイルの中身、文字列、コマンドをループの対象として扱うことができる。例えば、上のツリー構造のディレクトリのfile_a.txtの内容は
1 2 3 4 5 |
#国語の点数 出席番号,名前,科目,点数 1,アリス,国語,100 2,ボブ,国語,90 3,チャーリー,国語,50 |
とし、同じようにfile_b.txtの内容は
1 2 3 4 5 |
#数学の点数 出席番号,名前,科目,点数 1,アリス,数学,100 2,ボブ,数学,90 3,チャーリー,数学,50 |
で、file_c.txtの内容は
1 2 3 4 5 |
#英語の点数 出席番号,名前,科目,点数 1,アリス,英語,100 2,ボブ,英語,90 3,チャーリー,英語,50 |
とする。
1 |
for /f %a in (file_a.txt) do echo %a |
を実行すると
1 2 3 4 5 |
#国語の点数 出席番号,名前,科目,点数 1,アリス,国語,100 2,ボブ,国語,90 3,チャーリー,国語,50 |
と表示される。forの/Fはいくつかのオプションをつけることができる。ここでは、eolというオプションをつける。そうするとeolで指定した一文字が最初に現れる文をコメント行として読み飛ばすことができる。
1 |
for /f "eol=#" %a in (file_a.txt) do echo %a |
を実行すると、結果は
1 2 3 4 |
出席番号,名前,科目,点数 1,アリス,国語,100 2,ボブ,国語,90 3,チャーリー,国語,50 |
となる。skipのオプションもつけるとコメント行を含んで、ファイルを先頭から指定した行数を読み飛ばしてくれる。
1 |
for /f "eol=# skip=2" %a in (file_a.txt) do echo %a |
を実行すると
1 2 3 |
1,アリス,国語,100 2,ボブ,国語,90 3,チャーリー,国語,50 |
と表示される。delimsのオプションをつけると、指定した文字が区切り文字として扱うことができる。特に指定をしなければ、タブとスペースとなる。例えば、
1 |
for /f "eol=# skip=2 delims=," %a in (file_a.txt) do echo %a |
を実行すると
1 2 3 |
1 2 3 |
と表示される。しかし、この場合では区切り文字で分けられた最初の文字列しか保存することができない。次以降の区切り文字で分けられた文字列を保存するには、tokensのオプションが必要となる。
tokensのオプションは区切り文字で分けられた文字列を数字で指定して保存していくことができ、文字列はforで使われている変数からアルファベット順で順番に保存されていく。
1 |
for /f "eol=# skip=2 tokens=2 delims=," %a in (file_a.txt) do echo %a %b %c %d |
を実行すると
1 2 3 |
アリス %b %c %d ボブ %b %c %d チャーリー %b %c %d |
と表示され、
1 |
for /f "eol=# skip=2 tokens=2,3 delims=," %a in (file_a.txt) do echo %a %b %c %d |
とすると
1 2 3 |
アリス 国語 %c %d ボブ 国語 %c %d チャーリー 国語 %c %d |
と表示される。また、tokensのオプションは範囲で指定することもできる。
1 |
for /f "eol=# skip=2 tokens=1-4 delims=," %a in (file_a.txt) do echo %a %b %c %d |
とすると
1 2 3 |
1 アリス 国語 100 2 ボブ 国語 90 3 チャーリー 国語 50 |
tokensのおぷしょんでアスタリスクを用いるとtokensで残りの文字列が区切り文字もそのままで、保存されるべき次のアルファベットの変数に格納される。
1 |
for /f "eol=# skip=2 tokens=* delims=," %a in (file_a.txt) do echo %a %b %c %d |
を実行すると
1 2 3 |
1,アリス,国語,100 %b %c %d 2,ボブ,国語,90 %b %c %d 3,チャーリー,国語,50 %b %c %d |
となり、
1 |
for /f "eol=# skip=2 tokens=1,* delims=," %a in (file_a.txt) do echo %a %b %c %d |
は
1 2 3 |
1 アリス,国語,100 %c %d 2 ボブ,国語,90 %c %d 3 チャーリー,国語,50 %c %d |
と表示される。
usebackqのオプションはループの対象をファイルだけではなく、文字列やコマンドの出力にもすることができる。また、これはファイルがスペースを含んだファイルの時にも使われる。ファイルの場合は、ダブルクォーテーション(")で囲む。
1 |
for /f "usebackq eol=# skip=2 tokens=1-4 delims=," %a in ("file_a.txt" "file_b.txt" "file_c.txt") do echo %a %b %c %d |
を実行すると
1 2 3 4 5 6 7 8 9 |
1 アリス 国語 100 2 ボブ 国語 90 3 チャーリー 国語 50 1 アリス 数学 100 2 ボブ 数学 90 3 チャーリー 数学 50 1 アリス 英語 100 2 ボブ 英語 90 3 チャーリー 英語 50 |
と表示できる。
文字列の場合はシングルクォーテーション(')で囲む
1 |
for /f "usebackq tokens=1-4 delims=," %a in ('999,test,xxx,30') do echo %a %b %c %d |
を実行すると
1 |
999 test xxx 30 |
と表示される。
コマンドの場合はバッククォート(`)で囲む
1 |
for /f "usebackq tokens=1-2 delims=:" %a in (`time /T`) do echo %a時%b分 |
は
1 |
14時28分 |
のように表示することができる。
変数のオプション
コマンドプロンプトのforの変数を使う際にいくつかオプションをつけることもできる。基本的には%と変数の間にチルダ(~)と文字を入れることで使用することができる。
コマンドプロンプトのヘルプを引用すると
%~I | すべての引用句 (") を削除して、%I を展開します。 |
%~fI | %I を完全修飾パス名に展開します。 |
%~dI | %I をドライブ文字だけに展開します。 |
%~pI | %I をパス名だけに展開します。 |
%~nI | %I をファイル名だけに展開します。 |
%~xI | %I をファイル拡張子だけに展開します。 |
%~sI | 展開されたパスは短い名前だけを含みます。 |
%~aI | %I をファイルの属性に展開します。 |
%~tI | %I ファイルの日付/時刻に展開します。 |
%~zI | %I ファイルのサイズに展開します。 |
%~$PATH:I | PATH 環境変数に指定されているディレクトリを 検索し、最初に見つかった完全修飾名に %I を 展開します。 環境変数名が定義されていない場合、または検索 してもファイルが見つからなかった場合は、この 修飾子を指定すると空の文字列に展開されます。 |
である。例えば、
1 |
for /d %a in (*) do echo %a |
は
1 2 3 |
dir1 dir2 dir3 |
と表示されていたが、%と変数名の間にチルダ(~)とfを入れ、
1 |
for /d %a in (*) do echo %~fa |
を実行させると
1 2 3 |
C:\linuxcommand\net\test_for\dir_1 C:\linuxcommand\net\test_for\dir_2 C:\linuxcommand\net\test_for\dir_3 |
のように完全なパスで表示させることができる。
また、
1 |
for /r %a in (*) do echo %a |
は
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
C:\linuxcommand\net\test_for\file_a.txt C:\linuxcommand\net\test_for\file_b.txt C:\linuxcommand\net\test_for\file_c.txt C:\linuxcommand\net\test_for\test.bat C:\linuxcommand\net\test_for\dir_1\dir1_filea.png C:\linuxcommand\net\test_for\dir_1\dir1_fileb.png C:\linuxcommand\net\test_for\dir_1\dir1_filec.jpg C:\linuxcommand\net\test_for\dir_2\dir2_filea.html C:\linuxcommand\net\test_for\dir_2\dir2_fileb.html C:\linuxcommand\net\test_for\dir_2\dir2_dirA\dir2_dirA_filea.html C:\linuxcommand\net\test_for\dir_2\dir2_dirA\dir2_dirA_fileb.html C:\linuxcommand\net\test_for\dir_2\dir2_dirB\dir2_dirB_file1.txt C:\linuxcommand\net\test_for\dir_2\dir2_dirB\dir2_dirB_file2.txt C:\linuxcommand\net\test_for\dir_3\dir3_filea.js C:\linuxcommand\net\test_for\dir_3\dir3_fileb.js |
と完全なパスで表示されていたが、
1 |
for /r %a in (*) do echo %~nxa |
を実行すると
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
file_a.txt file_b.txt file_c.txt test.bat dir1_filea.png dir1_fileb.png dir1_filec.jpg dir2_filea.html dir2_fileb.html dir2_dirA_filea.html dir2_dirA_fileb.html dir2_dirB_file1.txt dir2_dirB_file2.txt dir3_filea.js dir3_fileb.js |
のようにファイル名と拡張子だけを抜き出すことができる。