2011-12-06 21 views
24

私はPHPプログラマです。残念ながら、私は簡潔にするつもりはないので、私のためにいくつかの画像を処理するバッチファイルを作成/使用する必要があります。Windowsのバッチファイルを処理してファイルを処理するディレクトリをループする?

これらのネストされたフォルダのそれぞれには、複数のTIFイメージを含むフォルダが1つあります。イメージの数は各フォルダによって異なります。私もバッチファイルを持っていて、Windows用のProcessImages.batを呼び出して、これらのTIFファイルを "ドロップ"することができます(または、batを呼び出すときにコマンドラインリストに明示的に指定することもできます)。そこには私が持っているEXEに基づいてすべての私のイメージプロセスで新しいフォルダを作成します。

良いことは、バットファイルは、あなたがドロップしたフォルダからのパスを使用するため、1つのフォルダのすべてのTIFを選択して処理を行うことができます...しかし、私は続ける私はそれが私のシステムを信じられないほど荒らされていると私が一度にこれらの1つを処理することができれば(それを手動で行うことなく)すばらしいだろうとTIFの300程度のフォルダのためにこれを手動で行う。

誰かが正しい方向(WindowsのバットファイルのAMATEUR)で私を指し示すことができる方法で私はディレクトリ内から呼び出すことができ、それはすべてを通過することができるWindowsのバットスクリプトを書くことができますそのディレクトリに含まれているディレクトリ...と私の処理バッチファイルを一度に1つの画像の各セットで実行する?

ありがとうございます!

タイラー

答えて

67

あなたはあなたがすべてのネストされたサブディレクトリに何をすべきかを正確に制御することができますバッチで再帰的なアルゴリズムを書くことがあります。

@echo off 
call :treeProcess 
goto :eof 

:treeProcess 
rem Do whatever you want here over the files of this subdir, for example: 
for %%f in (*.tif) do echo %%f 
for /D %%d in (*) do (
    cd %%d 
    call :treeProcess 
    cd .. 
) 
exit /b 
+0

ありがとう@Aacini!非常によく言いました!私は似たようなことに取り掛かっていましたが、どこにも行きませんでした。このコードを簡単にテストすると、期待どおりに動作することがわかります。 – Tyler

+1

@Aacini。これらの/ D、%% fコマンドが何をしているかを説明/コメントすることはできますか?それは素晴らしいだろう! – Dexters

+2

構文については、次のURLから見つけることができます。 http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/for.mspx?mfr=true –

42

Aaciniのソリューションは、動作しますが、あなたは1行でそれを行うことができます。

+0

何年後か分かりませんが、私はまだこれを使っています! – Tyler

+0

私はこれを使用しています。何らかの理由で、指定した拡張子を持つディレクトリツリーだけでなく、ディレクトリツリーのすべてのファイルに対してコマンドを実行します。 –

+2

私の方法では、すべてのサブディレクトリ。プロセスが特定の順序を必要とする場合(例えば、最初にファイルを移動して空のサブディレクトリを削除するなど)、 'for/R'を使用して達成することはできません。 – Aacini

1

ここでは、この場合について最も一般的な質問と思われます。

私は最終的にインターネット上で戻って見つけることができた古い宝石です:sweep.exe
現在のディレクトリとすべてのサブディレクトリで提供されたコマンドを実行します。


あなたはディレクトリのすべてのファイルを処理するいくつかのプログラムを持っている(ただし、ユースケースが本当にこれよりもはるかに広いです)と仮定しましょう:

For example, a file C:\Commands\processimages.cmd which contains: 
FOR %%f IN (*.png) DO whatever 

だから、あなたは現在のディレクトリにこのプログラムを実行したいですそして、すべてのサブディレクトリ:

:: Put sweep.exe in your PATH, you'll love it! 
C:\ImagesDir> sweep C:\Commands\processimages.cmd 

:: And if processimages.cmd is in your PATH too, the command becomes: 
C:\ImagesDir> sweep processimages 


長所:あなたは私を作るためにあなたの元のプログラムを変更する必要はありませんtサブディレクトリを処理します。必要に応じて、サブディレクトリを処理する選択肢があります。そして、このコマンドはとても簡単で使いやすいものです。

Con:いくつかのコマンド(スペース、引用符、わかりません)で失敗することがあります。例えば、this threadを参照してください。

+0

これはすばらしいです... – Tyler

2

私はこれが再帰ではないことを知っています(列挙されたサブディレクトリによる繰り返し?)ですが、一部のアプリケーションではよりうまくいく場合があります。

for /F "delims=" %%i in ('dir /ad /on /b /s') do (
    pushd %%i 
    dir | find /i "Directory of" 
    popd 
) 

必要に応じて3行目を置き換えます。

DIR /広告 - リストディレクトリのみ

はクールなことは、スペース場合がパスに引用符を必要としないのpushdです。

関連する問題