2011年5月18日水曜日

FOR /F その1 = FOR文でファイルを1行ずつ取り出して実行する方法 - Windowsのコマンドプロンプト(bat,cmd)

WindowsコマンドのFOR
○Windows XP
FOR /F で出来る事、その1です。
ファイルの内容を 1行ずつ取り出して、1行毎にコマンド実行する事が出来ます。

o このコマンドには、オプション delims と eol の既定値が設定されています。
    + 列を区切る delims オプション = 指定しないと、半角空白やタブで区切ります。
    + コメント行を示す eol オプション = 指定しないと、行の先頭が「;」(セミコロン)の時にスキップします。
o ですから、例えば1行を丸ごと取り出したい時は、行の中に出てこない文字を両方に指定します。
    + 「#」という文字が出てこない時は、「for /f "delims=# eol=#" %a in (ミクさん.txt)
    + この他、行の先頭に半角空白が出現しない時は、次のように書く事も出来ます。
    + 「for /f "delims= eol= " %a in (ミクさん.txt)


**** 書式
--------
for /f "usebackq [オプション文字列]" %変数名 in ( 読み込みたいファイル名 ) do 実行するコマンド
もしくは
for /f ["オプション文字列"] %変数 in ( 読み込みたいファイル名 ) do 実行するコマンド
--------

o コマンド名やキーワードは、大文字小文字のどちらでも大丈夫です。
    + 但し、変数名に限り、大文字小文字を区別します。
o /f = /F オプションです。
o usebackq = ファイル名を「"」(= 二重引用符)で括る時が出来ます。
    + 「"」(= 二重引用符)で括ると、ファイル名に空白を含む時も正しく解釈してくれます。
o オプション文字列 = 下記の表の通りです。
    + オプション文字列の指定が無い時の動作は、
        + ファイルから読み込んだ行を「半角空白、もしくはタブ文字」で区切り、最初の1つを取得します。
        + ファイルから読み込んだ行の先頭が「;」(= セミコロン)の時、その行をスキップします。
    + ファイルから取り出す時の、おすすめオプション文字列は
        + 半角空白やタブで区切りたい時は、"eol=  usebackq"
        + カンマで区切りたい時は、"eol=, delims=, usebackq"
            + eol の値を delims に合わせるのがポイントです。
            + そして、usebackq を付けると、空白付きのファイル名を扱う事が出来ます。
        + 後は、取り出したい値の位置に合わせて、 tokens=1,2 のように指定します。
o %変数名 = 変数になる名前です。変数名は1文字で指定します。(例: %i)
    + バッチファイルでは、%%変数名。「%」を2つ書きます。
    + 変数名のおすすめは、英字1文字。こちらはヘルプに書かれています。
        + 大文字小文字を区別しますので、使う時には気を付けます。
        + (仕様外の動作)実際には、英字の他に、数字や、漢字などの全角文字も使用出来ました。(= Windows XPの場合です。)
o 読み込みたいファイル名 = 次の制約があります。
    + ワイルドカード(「*」や「?」)は、事実上使用出来ません。
        + ファイルを探す時に、ワイルドカードをファイル名の一部とみなすからです。
    + 半角空白やカンマ区切りで、ファイル名を複数並べる事が出来ます。
        + ファイル名の区切り文字は、半角の空白、タブ、カンマです。(他にもあるかもしれません。)
        + 但し、先行するファイル名が見付からなかった時、後続のファイル名も読み込まれません。
        + ちなみに、オプション文字列 delims の指定は、ここでは関係ありません。
            + delimsは、ファイルから読み込んだ行に働く区切り文字です。
    + 空白などを含む名前を指定する時は、「"」(= 二重引用符)で括り、オプション文字列に usebackq を加えます。
    + ファイル名は、UNIX形式の区切り文字「/」も指定出来ます。(例「C:/ミクさん/ネギ.txt」)
    + 属性に関係なくファイルを見付つけます。確認した属性は、次の属性の組み合わせです。
        + r = 読み取り専用属性が付いているもの
        + a = アーカイブ属性が付いているもの
        + s = システムファイル属性が付いているもの
        + h = 隠しファイル属性が付いているもの
        + そして、上記の属性が全く付いていないもの
o 実行するコマンド = DO の後に書きます。
    + 複数並べたい時は、丸括弧(= 小括弧)で括る事も出来ます。
        + 括弧内で「環境変数を設定し、その値を参照する」時には、小技が必要になります。
        + 詳しくは、「バッチファイル。IF文やFOR文の中で複数コマンドを書く時の注意点
    + 大掛かりになる時は、CALL文が便利です。
    + 変数の使い方については、こちらをどうぞ
        + 「%変数の使い方
        + 「環境変数の使い方。置換と部分文字列

FOR /F のオプション文字列一覧
名前使用例意味
eoleol=;コメント行の先頭に書く文字です。1文字です。
初期値は「;」(= セミコロン)です。都合が悪い時に "eol=#"のように変更します。

o 基本的には、次の時に、1行スキップします。
    + 行の先頭が eolで指定した文字の時
        + eolの指定が無い時は、「;」(= セミコロン)です。
    + 行の先頭が列区切り文字(delimsの値)で、直後にeolの値が続く時
o 但し、行をスキップしない場合があります。
    + 下記のように、「eolとdelimsに、半角空白以外の同じ文字を指定」した場合です。

eol を無効にする方法 (Windows XP Service Pack 3の場合)
    + 半角空白以外で、delims の値と同じ値を指定すると、回避出来ました。
        + この時、FORコマンドは、「先頭の eolの値が削除された状態」で、行の値を取得します。
        + 例外は半角空白。"delims= eol= "の場合、eolは有効です。
        + また、"eol=" と書くと、「"」がeolの値になります。
    + カンマ区切りに合わせる時は、"delims=, eol=,"
    + (ヘルプにはありませんので、他のOSでは要検証)
skipskip=3ファイルの先頭で読み飛ばす行数を指定します。
指定出来る値は、1 以上です。
delimsdelims=,列区切り文字を指定します。2文字以上指定すると、単語で区切ります。
例えば「ミクさん」を指定すると、文字列「ミクさん」で区切ります。
初期値は、半角空白とタブです。
tokenstokens=1,2,3-5,*取り出す文字列の位置を指定します。
初期値は 1 です。1列目だけ取り出します。
記号の意味について
    + 「,」(= カンマ) = 例えば 1,2。別の変数として取り出します。
    + 「-」(= ハイフン) = 例えば 3-5。カンマを沢山書く時と同じです。
    + 「*」= 以降の文字列を1つの文字列として取得します。
tokensで数字を複数指定した時に使用出来る変数名
    + 使用例で、変数に%fを使っている時、次のように値が変数に入ります。
    + %f = 1列目の値
    + %g = 2列目の値
    + %h = 3列目の値
    + %i = 4列目の値
    + %j = 5列目の値
    + %k = 6列目以降の値。
    + (FORコマンドで指定した変数からのアルファベット順です)
    + (バッチファイルに書く時は、%%i のように%を2つ書きます)
delimsとの関係について
    + 行先頭の区切り文字は無視します。
    + また、区切り文字の複数並びは、1文字扱いです。
tokens で指定する数字について (Windows XP Service Pack 3の場合)
    + delimsを参照しながら、数字の位置にある値を取り出します。
    + 数字の並びに関係なく、行の先頭にある値から順に、変数に割り当てます。
    + 同じ数字を複数指定しても、取り出す値は1つです。
usebackqusebackqFOR コマンドの、IN の括弧内の解析方法を変更します。
「`」(= 逆引用符)で囲むと実行コマンド(通常は、「'」(= 一重の引用符))
「'」(= 一重の引用符)で囲むと文字列(通常は、「"」(= 二重引用符))
「"」(= 二重引用符)で囲むとファイル名。引用符無しもファイル名(通常は、引用符無しのみファイル名)
o オプション間は半角空白で区切ります。


**** 戻り値 ( ERRORLEVELの値。確認分のみ )
o (設定なし) = このコマンドは、ERRORLEVELの値を更新しません。
    + 但し、FOR の中で実行するコマンドが ERRORLEVELの値を更新する事があります。
    + 「(ミクさん) の使い方が誤っています。」 = 括弧の前に IN が抜けています。
        + もしくは、変数名の前に付く「%」の数が間違っています。
        + もしくは、オプション文字列に skip=0 を指定しました。


**** 使用例
o コマンドプロンプト画面で動かす時の書き方
--------
rem ファイル名を指定する方法
for /f %i in (ミクさん.txt) do echo %i

for /f %i in (ミクさん.txt ネギ.txt) do echo %i
for /f "eol=, delims=, tokens=1-3 usebackq" %i in ("ミクさんの髪は 青緑.txt") do echo %i, %j, %k
--------

    + コマンド名やキーワードは、大文字小文字のどちらでも大丈夫です。
    + %変数名 = 変数になる名前です。変数名は1文字で指定します。(例: %i)

o バッチファイルで動かす時の書き方
--------
for /f %%i in (ミクさん.txt) do echo %%i

for /f %%i in (ミクさん.txt ネギ.txt) do echo %%i
for /f "eol=, delims=, tokens=1-3 usebackq" %%i in ("ミクさんの髪は 青緑.txt") do echo %%i, %%j, %%k
--------

    + 変数名の前に「%」を2つ付けます。


**** 機能
o 指定したファイルを1行ずつ取り出して、実行します。

o ファイルから読み込む時、実際にデータの入っている行だけを読み込みます。
    + 空行とコメント行はスキップします。
o オプション文字列 eol (= コメント行の開始文字)について
    + Windows XPのヘルプでは、行末指定文字のように書かれていましたが、行の先頭で指定したときだけ有効です。


**** メモ
o オプション文字列 eol を指定しない時も、ファイルの各行の先頭文字に要注意です。
    + データの先頭に「;」(= セミコロン)が入る行は、スキップ対象になります。
    + 書式欄の説明にある、eolの値を無効にする方法がおすすめです。
    + なお、オプション文字列の最後を eol=" で終えると、「"」が先頭文字になりました。
o 実行時に「More ?」と質問された時は、おそらく文法誤りです。
    + 原因はおそらく、引用符の左右の数が合っていません。
    + とりあえず、「Ctrl」キーを押しながら「C」キーを押すと、止まります。


**** 確認したバージョン
o Windows XP Service Pack 3


==
関連ページ:
    ▼FOR = 繰り返し実行する
    ▼Windowsコマンド。制御文と環境変数▼ABC順
    ▼コマンドプロンプト画面
    ▼制作メモ
    > FOR /F その2 = コマンド実行結果を1行ずつ取り出して実行する
    FOR /F その3 = 指定した文字列の分割結果を取り出して実行する
(2012年2月5日追加。eolが有効、無効となる条件)
(2012年2月3日変更。eolとdelimsの両方に半角空白を指定した時、eolは有効)
(2011年6月7日訂正。書式欄にて、tokensの例を訂正。"tokens 3-5"の場合、変数3つを使用)
(2011年5月20日追加。メモ欄にて、空行とコメント行はスキップ)
(2011年5月18日訂正。オプション文字列eolとtokensの説明)