1. ホーム
  2. スクリプト・コラム
  3. DOS/BAT

DOSバッチ処理応用チュートリアル 第2章 DOSループ for コマンドの解説

2022-01-25 23:49:50

FORの話をする前に、わからないコマンドはCMDで直接入力できることをお伝えしておきます。

名前 /? コマンドを知らない人は、CMDと入力すればいい。

正式なものです。

I. 基本フォーマット

FOR %%variable IN (set) DO コマンド [コマンド-パラメータ].

変数には、置き換え可能なパラメータを示す一文字を指定します。
(セット) ファイルまたはファイル群を指定します。ワイルドカードを使用することもできます。
command 各ファイルに対して実行するコマンドを指定します。
command-parameters 特定のコマンドのパラメータまたはコマンドラインスイッチを指定します。

パラメータ:FORには4つのパラメータ /d /l /r /f があり、その役割について以下に例を挙げて説明します。
次に、各パラメーターの意味について説明します。

II. パラメータ /d

FOR /D %%variable IN (set) DO コマンド [コマンド-パラメータ].

セットにワイルドカードが含まれる場合、ファイル名ではなく、ディレクトリ名にマッチするように指定します。

Set(上で "関連ファイルまたはコマンド" と書いたもの)にワイルドカード(* と ?)が含まれている場合、指定したコマンドは(指定したディレクトリのファイル群ではなく)Setにマッチする各ディレクトリに対して実行されます。)

このパラメータは主にディレクトリ検索に使用され、次の例のようにファイル検索には使用されません。

@echo off
for /d %%i in (c:\*) do echo %%i
pause

この実行により、Cドライブのルートディレクトリにあるすべてのディレクトリ名が出力され、ファイル名は一切表示されません!

例えば、カレントパスの中で1~3文字しかないフォルダの名前を出力したいとします。

@echo off
for /d %%i in (????) do echo %%i
pause

こうすることで、カレントディレクトリに1~3文字の名前のディレクトリがあれば表示され、なければ表示されなくなります

ここで、「*」と「? 記号は任意のN文字、?記号は任意の1文字を意味します。

さて、この2つの役割がわかったところで、ここで考えさせられる問題があります。

@echo off
for /d %%i in (window?) do echo %%i
pause

Cドライブに保存して実行すると、何が表示されるでしょうか?ご自分の目で確かめてください。表示:ウィンドウ
Dパラメータは、カレントディレクトリ内のディレクトリ名しか表示しないので、注意が必要です!

III. パラメータ /R

FOR /R [[ドライブ:]パス] %%variable IN (セット) DO コマンド [コマンド-パラメータ].

drive:]path をルートとするディレクトリツリーをチェックし、各ディレクトリに FOR 文があるかどうかを確認します。Rの後にディレクトリが指定されていない場合は、カレントディレクトリが使用されます。setがドット(.)1文字のみの場合は、ディレクトリツリーを列挙します。

再帰的

上記で、/D は現在のパス下のディレクトリ名しか表示できないことがわかりましたが、この /R もディレクトリに関係するもので、何ができるのでしょうか。心配しないでください、彼は/Dよりずっと強力です!
彼は、現在のパスまたはあなたが指定したパスにあるすべてのファイル名を読み取ることができます。

2点ご注意ください。

セット内のファイル名にワイルドカード文字(? or *)を含む場合、/Rパラメータで指定したディレクトリとその下のサブディレクトリにある、セットにマッチするすべてのファイルがリストアップされ、マッチするファイルがないディレクトリはリストアップされません。
逆に、セットがワイルドカードを含まない特定のファイル名の場合、セット内の指定されたファイルが存在するかどうかにかかわらず、ディレクトリツリーが列挙される(すなわち、ディレクトリとその下のすべてのサブディレクトリが列挙される)。これは、先に説明した一点鎖線(.)でディレクトリツリーを列挙するのと同じことで、一点鎖線はカレントディレクトリを表し、これもファイルと見なすことができる。

@echo off
for /r c:\ %%i in (*.exe) do echo %%i
pause

このBATを任意のDドライブに保存して実行してみましょう。Cドライブのルートディレクトリと各ディレクトリのサブディレクトリにあるすべてのEXEファイルがリストアップされますね !!!

@echo off
for /r %%i in (*.exe) do @echo %%i
pause

パラメータが違う! このコマンドの前にC: \つまり検索パスがないので、彼は現在のディレクトリを検索パスとして使用します。例えば、あなたが彼をd: \test ディレクトリに入れて実行したBATは、その後彼はD: \test ディレクトリとそのサブディレクトリの下にリストされたすべてのEXEファイルになっているでしょう!!!!

@echo off
for /r c:\ %%i in (boot.ini) do echo %%i
pause

この例を実行すると、cドライブ上のすべてのディレクトリが列挙されるので、boot.iniが存在するディレクトリだけを列挙するためには、以下のように変更します。

@echo off
for /r c:\ %%i in (boot.ini) do if exist %%i echo %%i
pause

このコマンドでファイル検索ができるのは便利ですね。

このパラメータを理解する必要があります! やっぱり楽しいコマンドです!

IV. パラメータ /L

FOR /L %%variable IN (start,step,end) DO コマンド [コマンド-パラメータ].

このセットは、始まりから終わりまでインクリメンタルな形で数列を表します。したがって、(1,1,5) は 数列 1 2 3 4 5 を生成し、(5,-1,1) は 数列 (5 4 3 2 1)を生成することになります。

反復変数を使って開始値(Start#)を設定し、設定した終了値(End#)を超えるまで、値の範囲を漸次実行します。/Lは、Start#とEnd#を比較して反復変数を実行します。Start#がEnd#より小さい場合、コマンドが実行されます。反復変数が End# を超えたら、コマンドインタプリタがループを抜ける。また、負のStep#を使用すると、この範囲の値を減少させながらステップ実行することができます。例えば,(1,1,5) は 1 2 3 4 5 というシーケンスを生成し,(5,-1,1) は (5 4 3 2 1) というシーケンスを生成します.構文は次のとおりです。

この説明を見ると、ちょっとめまいがしてきますね~。そうならないように、例題を見てみましょう。

@echo off
for /l %%i in (1,1,5) do @echo %%i
pause

保存して実行すると、1 2 3 4 5 (1,1,5) から5つの数字を表示します。このパラメータは、1から5まで一度に1ずつ追加することを意味します。

ちょっと待てよ、数字を印刷すればいいのか...。さて、これで皆さんは十分でしょう。この例を見てください。

@echo off
for /l %%i in (1,1,5) do start cmd
pause

実装後、どのように5以上のCMDウィンドウ、ハァッ!ショックではありません。あなたがその(1,1,5)を(1,1,65535)に変更した場合、どのような結果になる、私は最初にあなたを教えて、65535 CMDウィンドウが開きます.... だから、多くのあなたが死ぬことはありません、あなたは強いです!

もちろん、我々はまた、その開始cmdをmd %%iに変更することができますし、それは特定のディレクトリを作成します!!!。名前は1-65535です。

破壊的な性質を持たせたこのパラメータを見た後、最後のパラメータを見てみましょう。

V. パラメータ /F

\ イテレーションと文書解析

コマンド出力、文字列、ファイルの内容を処理するために、ファイル解析を使用します。イテレーション変数を使用して、検査するコンテンツや文字列を定義し、さまざまなオプションを使って、さらに解析方法を変更します。反復変数として渡すトークンを指定するには、オプションのトークンオプションを使用します。注意: トークン オプションを使用しない場合、/F は最初のトークンのみをチェックします。

ファイルの解析処理は、出力、文字列、またはファイルの内容を読み取り、それを個別のテキスト行に分割し、各行を0個以上のトークンに解析することから構成されます。そして、イテレーション変数の値をトークンに設定することで、forループが起動されます。デフォルトでは、/F は各ファイルの各行の最初の空白のセパレータ番号を渡します。空行はスキップされます。

詳細なヘルプの書式は

FOR /F ["options"] %%variable IN (file-set) DO command [command-parameters].
FOR /F ["options"] %%variable IN ("string") DO command [command-parameters].
FOR /F ["options"] %%variable IN ('command') DO command [command-parameters].

引用符で囲まれた文字列 "options" には、異なる解析オプションを指定する1つまたは複数のキーワードが含まれています。これらのキーワードは次のとおりです。

eol=c - 行末コメント文字(1つだけ)を指します。
skip=n - ファイルの冒頭で無視する行数を指します。
delims=xxx - 区切り文字セットを参照します。これは、スペースとスキップのためのデフォルトのデリミタ・セットを置き換えます。
tokens=x,y,m-n - 各行からどのシンボルを各反復のためにfor自身に渡すかを参照します。この結果、追加の変数名が割り当てられます。m-n形式は範囲です。mthはn番目のシンボルを介して指定される。シンボル文字列の最後の文字がアスタリスクである場合、最後のシンボルがパースされた後に追加の変数が割り当てられ、その行の予約テキストが受け付けられる。このパラメータは、最大31フィールドまで区別できることが確認されている。

usebackq - バッククォート(キーボードの数字の1の左側のキー`)を使用します。
パラメータ usebackq を使用しない場合: file-set はファイルを意味し、スペースを含むことはできません。
二重引用符は文字列、つまり "文字列" を示します。
一重引用符はコマンドの実行を表します。
パラメータ usebackq を使用する場合: file-set と "file-set" は共にファイルを表します。
ファイルパスやファイル名にスペースがある場合、ダブルクォーテーションで囲むことができる
一重引用符は、文字列、すなわち'string'を示します。
バッククォートはコマンドの実行を表します.

上記は、ヘルプ情報を取得するためのfor /? コマンドで取得したヘルプ情報をそのままコピーしたものです。
目まいがするほど! ここでは、パラメータを理解するために、例をあげますね!


コマンド例1の場合。****************************************

@echo off
rem First create the temporary file test.txt
echo ;comment line, this is a temporary file, use up and delete >test.txt
echo 11 paragraphs 12 paragraphs 13 paragraphs 14 paragraphs 15 paragraphs 16 paragraphs >>test.txt
echo 21 paragraphs, 22 paragraphs, 23 paragraphs, 24 paragraphs, 25 paragraphs, 26 paragraphs >>test.txt
echo 31 paragraphs - 32 paragraphs - 33 paragraphs - 34 paragraphs - 35 paragraphs - 36 paragraphs >>test.txt
FOR /F "eol=; tokens=1,3* delims=,- " %%i in (test.txt) do echo %%i %%j %%k
Pause
Del test.txt

結果を表示するために実行します。

11 パラグラフ 13 パラグラフ 14 パラグラフ 15 パラグラフ 16
21段落 23段落 24段落 25段落 26段落
31段落 33段落 34段落~35段落~36段落
続けるには、いずれかのキーを押してください。. .

なぜこのようなことが起こるのでしょうか?説明しましょう。
eol=; セミコロンで始まる行はコメント行です。
tokens=1,3* 変数 %%i, %%j, %%k を各行の最初、3番目、残りのフィールドにそれぞれ代入します。
delims=,- (minus sign followed by a space) カンマ マイナス記号とスペースを区切り文字とし、スペースは必ず最後に入れる。


コマンド例2の場合。****************************************

@echo off
FOR /F "eol= delims=" %%i in (test.txt) do echo %%i
Pause

実行すると、コメント行を含む test.txt の全内容が、説明なしに表示されます。

コマンド例3の場合。****************************************

また、/Fパラメータを使用すると、次の例のようにコマンドの結果を出力することができます。

@echo off
FOR /F "delims=" %%i in ('net user') do @echo %%i
pause

つまり、ローカルアカウント名はすべてシングルクォートの内容を展開したもので、コマンド実行時にFORがコマンドの各行の結果を返すことを示します。さらに、"delims="は、行全体を表示するためにスペースを入れるためで、スペースより左側の列だけを表示するように追加してはいけません

基本的にFORの基本的な使い方はこれで終わりです...FORのシステムヘルプを読んだ人ならわかると思いますが、その下に特殊な変数があるので、今は割愛します。皆さん、もう飽きたはずです! あなたが疲れているのではなく、私が疲れているのです・・・。