DOSバッチコマンド For loopコマンド詳細説明
forコマンドは、コマンドラインやバッチプロセスで実行し、一連のオブジェクトに対して同一または複数のコマンドを順次ループ実行するコマンドで、一部のWindows管理プログラムと組み合わせることで、その処理能力と応用の柔軟性は目を見張るものがあります。しかし、そのヘルプ情報も複雑で、初心者には敷居が高く感じられることが多い。ここでは、私が理解した使い方をもとに、分解・簡略化しているので、見落としや間違いは避けられないかもしれません。
基本的な書式
(これはコマンドラインで使用される形式です。バッチプロセスを使用している場合は、余分な % を追加して %% を形成する必要があります).
for / 引数 % 変数 in (set) do コマンド
(注:上記は中国語を除き、大文字と小文字を区別して書かれています)
パラメータ FORにはD L R Fの4種類のパラメータがあり、そのうちのいくつかは以下のような追加オプションを持つことができます。
変数: (バッチで for コマンドを使う場合は、変数の前の % を %% に変更することを忘れないでください) 変数名は1文字で大文字と小文字を区別します (オリジナルのヘルプに書いてありますが、実際には変数名として1つの数字を使うとうまくいくことが証明されています)、例えば %B と %b は異なる変数を表します。
FORコマンドでは、ループ毎にin(セット)から読み込んだ値をこの変数に代入し、以降のコマンドで参照できるようにします。
set: あるコマンドによって生成された一連のファイル、文字列、またはコンテンツによって形成されるコレクション(もちろんワイルドカード * ? を使い、環境変数も参照する)、FORコマンドはセットの内容を一定の順序と規則性で読み取り、変数に値を代入し、セットの内容を読み取るまで次のループのラウンドのdo以降のコマンドを実行、形式上括弧が必要(inはその後の括弧の間にスペース)、です。
コマンド:適格なDOSコマンドやDOSから呼び出せる外部プログラムであれば何でもよく、括弧を使って複数のコマンドを囲み、1つのループで実行することも可能です。
注)ディレクトリ名やファイル名にはスペースを含むものもあるため、セットとコマンドは全体を示すために英語の引用符(ただし、引用符の中身を文字列とみなすこともある)で囲む必要がある場合が多く、以下に始まる例の中には、簡単のためにこのようなスペースを含むファイル名やディレクトリ名の場合を無視するものもある。
次に、パラメータ別に例を挙げて使い方を説明します。
I. パラメータ /d
for /d %% variable in (set) do コマンド
引数/dは、ファイルではなく、ディレクトリのみを実行することを指定するforコマンドです。
例1:
コマンドラインで入力する(バッチではありません、その後の説明は不要です)
for /d %a in (c:\*. *) do echo %a
この実行により、Cドライブのルートディレクトリ内のすべてのディレクトリが部分的に表示されますが、ファイル名は表示されません
ちょっとごちゃごちゃしてますね、コマンドプロンプトの表示をOFFにすればスッキリしますよ。
for /d %a in (c:\*. *) do @echo %a
II. パラメータ /R
Rパラメータの後に、ディスクレターとパスを指定することもできます。
for /r この後に、(set) do コマンドのパス % 変数を続けることができます。
r の後のパスは、英語のピリオド 1 つだけなら、その下のディレクトリツリー全体 (DOS コマンドツリーでの範囲に相当) のすべてのディレクトリを参照します。r の後のパスは,現在のパスの下のディレクトリツリー,パスが省略された場合はカレントディレクトリを指し,その後ろの in (set) は,前の各ディレクトリに付随するファイルの集合に対応するものである
ここで、in (set)のワイルドカードの有無により、次の2つのケースがあります。
1) in(set)にワイルドカードが存在しない場合
単一のファイルまたはリストされた特定のファイルが指定されている(複数のファイル名は、スペース、カンマなどのセパレータで区切られます)。
例2
@echo of
for /r . %i in (abc.txt) do echo. > %i
echo on
注:ここでのfor /rの後のパスは、1つだけの. そして、その後の各ループでの echo. > %i は、空行が1つしかないテキストファイルを作成することと同じで、全体としては、カレントディレクトリのサブレコードを含む各ディレクトリに abc.txt を作成する効果があります。
例3(バッチ処理に入れる)
@echo off
rem Show a list of all files in the d: drive with the names file1 and file2
for /r d:\ %%h in (file1,file2) do if exist %%h echo %%h
pause
2) in(set)にワイルドカード * または ?
この場合の do コマンドは、前の /r で指定された一連のディレクトリの中で、(set) に含まれるファイルを含むすべてのエントリを処理し、一致するファイルを含まないディレクトリは無視します。
例4.
@echo off
rem Delete all *.chk files from the C drive
for /r c:\ %%h in (*.chk) do del /q %%h
pause
注意:del /q はクワイエットモードでの削除を意味します(確認は不要です)。
III. パラメータ /L
for /L %% variable in (start value, each value increase, end comparison value) do command
(上記のLは小文字にすることもできますが、主に数字の1と混同しないように視覚的に使うことはありません)
(開始値、各増加値、終了時比較値)は、quot;開始値"の数値から始まり、各増加値"でどれだけ増やすか(負数も設定可能)、quot;終了時比較値で等しい数の列となる これを超えたらforループは終了(後のdoコマンドは実行されない)。
例えば、(1,1,3) は (1 2 3) というシーケンスを生成し、 (1,2,9) は (1 3 5 7 9) というシーケンスを生成し、 (5,-1,1) は (5 4 3 2 1) というシーケンスを生成し、 (1,3,18) は (1 7 10 13 16) というシーケンスを生成することになります。
例5
@echo off
::Create five folders aa1~ aa5 in D drive
for /L %%i in (1,1,5) do md d:\aa %%i
pause
注)行頭のシングルコロン:の後に名前を付けるとマーカー行となり、バッチでgoの後に指される位置に対応する。ダブルコロン::は一般にコメントに使われ、バッチではrem+スペースで表現できる。若干の違いはあるが。
IV. パラメータ
このパラメータ /f を指定すると、セット内のファイルが開かれ、for コマンドでテキストファイルの読み込みや追加、削除、置換などの編集操作が可能になり、強力であるため比較的複雑な操作ができるようになります。
ファイル名 - セット
for /f "options" % variable in ("string"-set ) do command
コマンドセット
f の後にはいくつかのオプションを付けることができ、オプションなしはもちろん修飾形式、引数ありは全体を引用符で囲む必要があり、続くセットは主に3つの形式からなり、最終的にはforループの各ラウンドで読まれる文字列の行を形成し、指定した%変数や、オプションから得られる追加の変数に値を割り当て、ドの後に続くコマンドを実行することになります。
以下は、各小節の使い方を段階的に説明し、理解するための例です。
例6
d:\abc.txt の内容が以下の通りであるとします。
名前 性別 年齢 同等性
チャン・サン 男性 36 A-1
李斯(リ・シー) 男 29 B-2
Zhao Liu F 31 A-2
以下のコマンドを実行します。
for /f %c in (d:\abc.txt) do @echo %c
すると、画面が表示されます。
名称
チャン・サン
李斯
趙劉
説明 for /r のデフォルトが "%variable" の前の引数オプションの場合、ループの各ラウンドは、オープンファイル内の文字列をスペース区切りで一行ごとに分割するのがデフォルトで、追加の変数はない(つまり変数 %c のみ)ため、最初の段落の文字のみが %c に代入され、次に do 以下のコマンドが実行されて、次のループが進み、デフォルトで空行が無視される場合です
変更する。
for /f "skip=1 tokens=1,4 delims= " %c in (d:\abc.txt) do @echo %c %d
として表示されます。
チャン・サン A-1
リー・シー B-2
Zhao Liu A-2
解決策
skip=1 は、本文の冒頭で無視する行数を 1 - 何行にするかという意味です。
delims= 行では、どのような単一のシンボル(複数の文字の組み合わせを持つことができ、間にスペースを追加することはできません、そのようなスペース文字は最後に配置する必要がありますように、単一の文字の数として理解されている)割り当てを読むためにユニットとして文字列を分離するために、この例は中符号の後にのみスペースを分離することを意味し、空である。-- スライスするために使用するナイフ
tokens=1,4 等号の後の数字は、%変数と追加変数に順番に割り当てる分割文字列の数を示し、この場合、最初のセグメントは%cに割り当てられ、4番目のセグメントはc以降の変数に割り当てられ、%dに割り当てられます、そして、tokens=1,2,5-7またはtokens=1,2,3*またはtokens=1, 2のように記述することができます。 5,7 はそれぞれ、1,2,5,6,7 (%c, %d, %e, %,f, %g 計5変数に順番に割り当てる), 1,2,3 と3以降の全セグメント (3 変数に割り当て), 1,2,5,7 (4 変数に割り当て) という意味で、tokens=以降の番号は順番が狂っても良いが、書き順は割り当てた順番と一致する、つまり変数への割り当ては、このようになります。その後のdoコマンドで使うかどうかについては、また別の問題です。つまり、 ---- はせいぜいどの段落を取るかだけである。
in(変数)は開始変数名を表し、追加変数名は定義されたトークンの総数で展開される、例えば総数が3なら%cは%dと%eに、%Cは%D%Eに...といったように。この例では、tokens=1,4 の2つだけが必要で、開始は()括弧内の%c、次に各行の最初のパラグラフが%cに割り当てられ、最初のパラグラフが%cに割り当てられ、4番目のパラグラフが変数%dに割り当てられる。
2行目を例に(最初の行はskip=1によってスキップされます)、"張三男36 A - 1で"(もスペースで区切られることが起こる)スペースのナイフでカット5段落の合計、最初の限り、4、つまり、張三が%c、%d、@echo %c %dの実装に割り当て、次にラウンドに割り当て...と空行は通常省略されています。
さらに若干の変更。
for /f "skip=1 tokens=4,1 delims=- " %c in (d:\abc.txt) do @echo %c %d
と表示されます。
ア・ジャン・サン
B 李四
A趙劉
例7
d: \a.txt の内容が以下の通りであるとします。
DドライブのボリュームはMYDA
ボリュームシリアルナンバーはC35D-8998
D:tmpのディレクトリ
09/25/2001 10:40 AM 11,235 yg0925.txt
11/12/2001 04:29 pM 795 buple.txt
2002年11月04日 04:18 AM 2,043 vitn.txt
3File(s) 12,673 bytes
0 Dir(s) 5,020,200,655 bytes free
コマンドラインで、次のように入力します。
for /f "skip=5 tokens=5" %a in (d:\aa.txt) do @echo %a
表示されます。
yg0925.txt
buple.txt
vitn.txt
フリー
この意図は、ファイルにリストされたファイルを表示することです(もちろん、ファイルを操作する他のコマンドに置き換えることができます)。
skip=5とすることで、最初の5行は無視され、デフォルトでは各行の5文字目がtokens=5となり、変数%aにファイル名が問題なく代入されます。
例のaa.txtの内容は、明らかにdirコマンドのある実行後の内容である。同様のコマンドで使用することができます。
dir > d:\a.txt で作成します。
余談ですが、dirに適当なパラメータ/bを付ければ冗長な部分を回避できますし、/adを付ければディレクトリのみを表示、/a-dを付ければファイルのみを表示、等々も可能です。
の後の('command'-set)に直接コマンドを書けばいいのです。
for /f "skip=5 tokens=5 " %a in ('dir') do @echo %a
効果は同じです。
注:コマンドセットは、ファイルセットでないことを示すために一重引用符で、文字列セットであることを示すために二重引用符で囲む必要があります。この例を実行しても何も表示されない場合は、setコマンドで一度実行し、表示方法を確認する必要があります。また、tokens=5をtokens=4に変更したり、dirに/a-dを追加してディレクトリが表示されないようにしたりすることもできます。
セットが複数のファイルで構成されている場合、あるファイルを処理した後、別のファイルを処理すると、行数の異なるファイルごとにサイクル数(doコマンドの数)が異なることになります。
セットがコマンドによって生成されるシステムである場合、その後に続くdoコマンドを適切に配置するために、まずそのコマンドの実行によって生成される文字システムを熟知しておく必要があります
整理すると、in以降の集合がどのような形を取ろうとも、for/fは最終的に文字列に分解され、「"数行を無視するか" (skip=), "what knife to slice" (delims=), "at most which lines to take" (delims=), and "at most which lines to take" (delims=) というオプションが付いています。"セットで形成された文字列は、%または%%以降の変数と、do以降のコマンドを実行するために拡張する可能性のある変数に一行ずつ割り当てられ、一行が一サイクルとなる。ここではすべてのパラメータを完全に説明しているわけではありませんので、for/?を使ってご覧ください。(以下、斜体文字はヘルプからのコピーです)
例
スペースを含むファイル名の場合は、ファイル名を二重引用符で囲む必要があります。このように二重引用符を使用するためには、usebackqオプションも使用する必要があります。そうしないと、二重引用符は解析される文字列を定義していると解釈されるからです。--言い換えれば、()内の二重引用符とusebackq引数(/fの場合は後ろに引用符)は、そのままファイル名となるのです。
eol=というオプションもあります。前述のようにskip=は最初の数行を無視するという意味ですが、デフォルトではセミコロン";"で始まる行もすべて無視します。セミコロンで始まる行を無視したい場合や、指定した文字で始まる行を無視したい場合は、for /fの後のquoted引数でeol=とします。しかし、deims=のように複数定義できず1つのみです。
もう一工夫:%~演算子を使って、ファイル名をファイル名、拡張子、ディスクなどのパーツに分離することができます、説明はfor/? (ここでは例の変数が %I) の説明を参照してください。
また、FOR変数参照の置換が強化されました。以下のようなオプション構文が使用できるようになりました。
~I - クォート(")を削除し、%I を展開します。
%~fI - %I を完全修飾パス名に展開します。
%~dI - %I をドライブ文字だけに展開します。
%~pI - %I をパスだけに展開します。
%~nI - %I をファイル名のみに展開します。
%~xI - %I をファイル拡張子のみに展開します。
%~sI - パスを展開し、短い名前のみを含むようにします。
%~aI - %I をファイルの属性に展開します。
%~tI - %I をファイルの日付/時刻に展開します。
%~zI - %Iをファイルのサイズに展開します。
%~$PATH:I - 環境変数 path にリストされているディレクトリを検索し、%I を展開します。
を最初に見つかった完全修飾名に変換します。もし、環境変数名
が定義されていない場合、またはファイルが見つからない場合、このキーの組み合わせは空の文字列に展開されます。
修飾語を組み合わせて、複数の結果を得ることができます。
%~dpI - %I をドライブ番号とパスだけに展開します。
%~nxI - %I をファイル名と拡張子だけに展開します。
%~fsI - %I をフルパス名と短い名前にのみ展開します。
%~dp$PATH:I - 環境変数 path にリストされているディレクトリを見つけ、%I を展開します。
を、最初に見つかったドライブ番号とパスに変換します。
%~ftzaI - %I を出力行の DIR に似せて展開します。
ひとこと:%~で始まる演算子は、ファイル名や環境変数の分離操作です。そして、それぞれを使いこなすには、大変な作業と練習が必要です。
運動すること。(ちょっと怠けていて、自分ではやっていませんが...)
CディスクとDディスクを巡回し、既知のファイル名を探し(キーボード入力を受ける)、その場所、時間、D: \mynote.txt に記録 以下のようなフォーマットで記録します。
ディスクCとDにあるxxファイルは次のとおりです。
時間 位置
。。。。。。。。。。。
。。。。。。。。。。。
。。。。。。。。。。。
.
.
.
ヒント 使用可能なDOSコマンド、変数、パラメータ: echo, set , set/p, %date%, %~ >, >>
概要とコツ
forコマンドの実際の使い方は基本的に以上ですが、これだけでは強力なバッチ処理を書くことはできず、単なるDOSコマンドなので、その強力で実用的な機能をフルに発揮させるには、他のいくつかのDOSコマンドやWindowsシステムが提供するコマンドを組み合わせて、複雑なものを意外に簡単かつ便利にする技術を身に付ける必要があります。
forコマンドは実際にはループを作るため、環境変数の値を一巡するごとに変更する場合、デフォルトの状態では、環境変数%付きのforコマンドは一度だけ値を取り、次のループで再び前の値を変更する(doの後に括弧をつけた複数のコマンドの実行期間を含む)ため、目的の達成はできない、そのため以下のコマンドを導入しています。
setlocal enabledelayedexpansion
バッチファイルでの環境変更のローカライズを開始し、遅延環境変数の展開を開始します。バッチファイルの終了時にSETLOCALを実行すると、そのバッチファイル内の未処理の各SETLOCALコマンドに対して暗黙のうちにendlocalが実行されます。
変数の値を取得する際に、「変数名!」を使用すると動的に値を取得でき、「遅延環境変数展開」を使用すると実行時に別の文字(感嘆符)で環境変数を展開することができます。この使い方は、実はバッチ処理におけるすべての複合コマンドの中で、注意が必要なものに該当します。バッチ終了後に変更した環境を残したくない場合は、必ずsetlocalを追加することをお勧めします。
システムとネットワークに関する他のいくつかの複雑なコマンド(wmic、netなど)を組み合わせた場合、それはコマンドでローカルディスクを横断するなど、FORの英雄的な性質だけです:wmic logicaldisk where "drivetype=3" get name 明らかにすべてのディスクでファイルを見つけるために、行う。 forコマンドを使用するには簡単ですが、他のコマンドやコンピューターの基本も必要で、作業することが必要です。ああ、私のレベルは限られている、低レベルのものしか書けない・・・。DOSで初めてここのFORコマンドを見る機会がある方の参考になれば幸いです。
関連
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン