Performing an operation in each subdirectory of a directory tree from batch
http://blogs.msdn.com/oldnewthing/archive/2007/05/11/2532913.aspx
バッチファイルからディレクトリツリーの各々のサブディレクトリでコマンドを実行するために、以下のコマンドを適用することができる:
for /f "delims=" %%i in ('dir /ad/s/b') do echo %%i
(コマンドプロンプトからこのコマンドを実行したいなら、パーセント記号を二重にしない)
/F
オプションはFOR
コマンドのいろいろな特殊機能を有効化する。最も重要な変化は、単一引用符内の文字列を実行したときの出力をコマンドとして解釈するということである。(usebackq
オプションを使うとこの機能は変化するが、ここでは使っていない。)したがって、FOR
命令はdir /ad/s/b
コマンドを実行して、出力を解析する。dir /ad/s/b
コマンドはディレクトリだけを再帰的にリストアップし、見つかったディレクトリの名前のみを表示する。
私たちが提供したオプションdelims=
はデフォルトの区切り文字をスペースから何もなしに変更する。これはすべての行が%i
変数変数に読み込まれることを意味する。(通常は、最初の単語だけが%i
に割り当てられる。)したがって、このFOR
ループはサブディレクトリ名が代入された%i
変数内の各サブディレクトリに対して1度だけ実行する。
このコマンドは各行が単にディレクトリ名を表示すよう要求する。現実的には、たぶんここにもっと面白いものを置くだろう。たとえば、各ディレクトリのセキュリティー記述子をダンプするには(これはこのエントリを書く動機となった最初の問題だった)、これをコマンドライン上でタイプすればいい:
for /f "delims=" %i in ('dir /ad/s/b') do cacls "%i" >>"%TEMP%\cacls.log"
あら探しする人のコーナー
私は誰もが本当にバッチファイルで作業が楽しくなるとは思わないが、それはこのヒントでは作業が効率的にならないという意味ではない。