goo blog サービス終了のお知らせ 

コード溜め

備忘録的コンピュータ日記

[Windows]バッチファイルでforループ

2006-11-27 00:04:28 | Windowsコマンド CMD/WSH

普段、Linuxのコマンドをバッチ処理するときにはシェルスクリプトで書いているけど、それをWindowsでやれといわれたときに困った。特にforeachっぽい処理。ちゃんと古来からのやり方があった。


FOR %%N in (a b c ) DO command parmas...


ex)
for %%N in ( *.txt ) do (
program1 %%N
program2 %%N
)


%記号を2重で書くのは、バッチファイルの中でのみ。


あと、最近のWindowsではコマンド拡張機能、というのがあり、cmd /E として、コマンドラインプロンプトを起動するといろいろオプションが使える。便利そうなのが/R


for /R [ディレクトリ] %%N in (セット) do コマンド オプション


で、ディレクトリ以下、再帰的にforのループ処理を繰り返す。ほかに以下のようなものもあるらしい。


FOR /F ["オプション"] %変数 IN (ファイル セット) DO コマンド
[コマンド パラメータ]
FOR /F ["オプション"] %変数 IN ("文字列") DO コマンド [コマンド パラメータ]
FOR /F ["オプション"] %変数 IN ('コマンド') DO コマンド [コマンド パラメータ]


または usebackq オプションの場合:


FOR /F ["オプション"] %変数 IN (ファイル セット) DO コマンド
[コマンド パラメータ]
FOR /F ["オプション"] %変数 IN ('文字列') DO コマンド [コマンド パラメータ]
FOR /F ["オプション"] %変数 IN (`コマンド`) DO コマンド [コマンド パラメータ]


ファイル名セットは、1 つ以上のファイル名です。各ファイルが開かれ、読み
取られ、処理されてから、ファイル名セットの次のファイルに進みます。処理
には、ファイルの読み取り、個々のテキスト行への分割と、0 個以上のトークン
への解析が含まれます。その後、変数値を見つかったトークン文字列に設定して、
for ループの本体が呼び出されます。既定では、/F は、各ファイルの各行から、
空白で区切られた最初のトークンを渡します。空白行はスキップされます。既定
の解析動作を変更するには、オプションの "オプション" パラメータを指定しま
す。これは、異なる解析オプションを指定する 1 つ以上のキーワードを含む、
引用符で囲まれた文字列です。キーワードは、次のとおりです:


eol=c - 行末のコメント文字を指定します (1 文字)。
skip=n - ファイルの先頭でスキップする行数を指定します。
delims=xxx - 区切り文字のセットを指定します。これは、既定の
区切り文字であるスペースとタブを置き換えます。
tokens=x,y,m-n - 各繰り返しに対して、各行から for 本体に渡すトー
クンを指定します。これにより、追加の変数名が割り当
てられます。m-n の形式は範囲で、m 番目から n 番目の
トークンを指定します。tokens= 文字列の最後の文字が
アスタリスクである場合は、追加の変数が割り当てられ、
最後のトークンが解析された後、行に含まれている残り
のテキストを受け取ります。
usebackq - 次の新しい表示形式を指定します。逆引用符で囲まれた
文字列がコマンドとして実行され、一重引用符で囲まれた
文字列がリテラル文字列コマンドになりファイル名セット
のファイル名を二重引用符で囲めるようになります。


例を参考にしてください:


FOR /F "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do @echo %i %j %k



コメントを投稿