2011年3月6日日曜日

FOR /R = FOR文でサブフォルダーも処理対象にする - Windowsのコマンドプロンプト(bat,cmd)

WindowsコマンドのFOR
○Windows XP
FOR文を普通に書くと、一つのフォルダーの中だけでファイルを探します。
/R オプションを付けると、サブフォルダーの中にあるファイルも処理の対象にする事が出来ます。

o ワイルドカード(「*」や「?」)を使わない場合、動きが独特ですので注意します。
    + 見つかったフォルダー毎に、「見つかったフォルダー + "\" + 指定した文字列」が渡ります。
o /D オプション(= フォルダーのみ検索します)と一緒に指定する事も出来ます。


**** 書式
--------
for [/d] /r [ 検索するパス ] %変数名 in ( 検索するファイル名 ) do 実行するコマンド
--------

o コマンド名やキーワードは、大文字小文字のどちらでも大丈夫です。
    + 但し、変数名に限り、大文字小文字を区別します。
o /d = /D オプションです。
    + このオプションを指定すると、ワイルドカードを指定した時に、ファイルではなくフォルダーを探します。
    + このオプションを /R オプションの後ろに置く時は、「検索するパス」の後ろに置きます。
o /r = /R オプションです。
o 検索するパス = ここで指定したフォルダーの下を探します。
    + 省略すると、カレントディレクトリ(= 現在居る場所)の下を探します。
    + 存在しないフォルダーを指定する事も出来ます。
    + ここでは、UNIX形式の区切り文字「/」も指定出来ます。(例「C:/ミクさん」)
    + 空白やカンマ付きのフォルダーを指定する時は、「"」で括り、ワイルドカードを含めて指定します。
        + (例「"C:\ミクさん ネギ"」)
o %変数名 = 変数になる名前です。変数名は1文字で指定します。(例: %i)
    + バッチファイルでは、%%変数名。「%」を2つ書きます。
    + 変数名のおすすめは、英字1文字。こちらはヘルプに書かれています。
        + 大文字小文字を区別しますので、使う時には気を付けます。
        + (仕様外の動作)実際には、英字の他に、数字や、漢字などの全角文字も使用出来ました。(= Windows XPの場合です。)
o 検索するファイル名 = 「検索するパス」からの相対パスで指定します。
    + このコマンドは、「検索するパス」の下層にあるファイルのみを探す事を想定しています。
    + ワイルドカード(「*」や「?」)を使った時、「検索するパス」の下層にあるファイルだけを実際に探します。
    + ワイルドカードを使わない場合は、渡したい文字列を書く事が出来ます。
        + この時、FOR文は、ファイルの存在判定を行いません。
        + 「検索するパス」自身とサブフォルダーが見つかる度に実行します。
        + 変数に入る値は、「見つかったフォルダーのパス + "\" + 指定した文字列」になります。
        + ですので、実際に使う時は、呼び出したコマンド側で、変数を加工する必要があります。
        + 制限事項として、「*」、「?」、空白、カンマは渡したい文字列に使用する事が出来ません。
    + ファイル名は、複数指定する事が出来ます。空白やカンマで区切ります。
        + 検索結果が重複する時、1つのファイルに付き、コマンドを複数回呼びします。
    + 次の時は、「"」で括り、ワイルドカードを含めて指定します。
        + 空白やカンマ付きのフォルダーを指定する時(例「"a\miku san?"」)
        + ファイル名の中に「*」や「?」が含まれていないと、単なる文字列とみなしますので、注意します。
    + UNIX形式の区切り文字「/」は、基本的には指定出来ません。
        + 「"」で括り、ワイルドカードを含めて指定する(例「"a/miku*"」)と、ヒットはするみたいですが、変数に入るのは「検索するパス + "\" + 見つかったファイルのファイル名部分」です。
o 実行するコマンド = DO の後に書きます。
    + 複数並べたい時は、丸括弧(= 小括弧)で括る事も出来ます。
        + 括弧内で「環境変数を設定し、その値を参照する」時には、小技が必要になります。
        + 詳しくは、「バッチファイル。IF文やFOR文の中で複数コマンドを書く時の注意点
    + 大掛かりになる時は、CALL文が便利です。
    + 変数の使い方については、こちらをどうぞ
        + 「%変数の使い方
        + 「環境変数の使い方。置換と部分文字列


**** 戻り値 ( ERRORLEVELの値。確認分のみ )
o (設定なし) = このコマンドは、ERRORLEVELの値を更新しません。
    + 但し、FOR の中で実行するコマンドが ERRORLEVELの値を更新する事があります。
    + 「(ミクさん) の使い方が誤っています。」 = 括弧の前に IN が抜けています。


**** 使用例
o コマンドプロンプト画面で動かす時の書き方
--------
@echo off
for /r c:\ミクさん\ネギ料理 %f in (*の作り方.txt) do echo ミクさんの料理メモ : %f

for /d /r c:\ミクさん %f in (*料理*) do echo ミクさんの料理フォルダー : %f
echo on
--------

    + コマンド名やキーワードは、大文字小文字のどちらでも大丈夫です。
    + /R コマンドだけ指定した時は、指定したファイルを探します。
    + /D /R を指定すると、指定したフォルダーを探します。
    + どちらも、ワイルドカードが付いていますので、実在するものを探します。

o バッチファイルで動かす時の書き方
--------
@echo off
for /r c:\ミクさん %%f in (ネギ料理\*の作り方.txt) do echo ミクさんの料理メモ : %%f
for /d /r c:\ミクさん %f in (*料理*) do echo ミクさんの料理フォルダー : %f
--------

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


**** 機能
o ワイルドカード(「*」や「?」)を使ったパスを指定すると、「検索するパス」の下層にあるファイルを探して繰り返します。
    + 見つけたフォルダーのファイルは、変数の中に入れます。
    + 見つかったファイルのパスを、変数の中に入れます。
o ワイルドカードを使わない場合、単なる文字列として、「検索するパス」の下層にあるフォルダー毎に1回ずつ実行します。
    + 「検索するパス + "\" + 指定した文字列」を、変数の中に入れます。
o 空白やカンマで区切ると、複数のパス(もしくは文字列)を指定する事が出来ます。
o 「検索するファイル名」の中に空白やカンマを含めたい時は、ワイルドカードを使用して、かつ、「"」でパスを括ります。


**** メモ
o ワイルドカード使用時、隠しファイル属性を持つファイルは、検索対象から除外されます。
o ワイルドカードを使わない時の動作は、ファイル名部分は単なる文字列渡しです。


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


==
関連ページ:
    ▼FOR = 繰り返し実行する
    ▼Windowsコマンド。制御文と環境変数▼ABC順
    ▼コマンドプロンプト画面
    ▼制作メモ
    > FOR /F + DIR /B = ファイル名を順番に取り出して実行する方法
    FOR /F その1 = ファイルを1行ずつ取り出して実行する
    FOR /F その2 = コマンド実行結果を1行ずつ取り出して実行する
(2011年5月16日追加と訂正。書式欄の変数名。大文字小文字を区別する。推奨は英字のみ)
(2011年3月6日変更。パスの表記を、なるべくファイル名に変更)