web-dev-qa-db-ja.com

ディレクトリを介してファイルを処理するWindowsバッチファイル?

さて、私はPHPプログラマーです。残念ながら、簡潔にするために発表しない理由のために、画像を処理するバッチファイルを作成/使用する必要があります。

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

良いのは、batファイルが「ドロップ」するフォルダーからのパスを使用するため、1つのフォルダーのすべてのTIFを選択してドロップし、処理を実行できることです...しかし、私が持っているTIFの300ほどのフォルダは、信じられないほどシステムを動かしているので、一度に1つしか(手動で処理せずに)処理できれば素晴らしいと思います。

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

前もって感謝します!

タイラー

36
Tyler

入れ子になったすべてのサブディレクトリで行う操作を正確に制御できる再帰的なアルゴリズムをバッチで作成できます。

@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
86
Aacini

Aaciniのソリューションは機能しますが、1行で実行できます。

for /R %%f in (*.tif) do echo "%%f"
58
Jack Allan

これは再帰(列挙されたサブディレクトリを介した反復?)ではないことはわかっていますが、一部のアプリケーションではより適切に機能する場合があります。

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

3行目を必要なコマンドに置き換えます。

dir/ad-ディレクトリのみを一覧表示する

クールなのはpushdパスにスペースがあれば引用符は不要です。

2
Manicalic

このケースについて最も人気のある質問のようにここに投稿します。

これが私がついにインターネットで見つけた古い宝石です: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


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

Con:コマンドによっては失敗する場合があります(スペース、引用符を含む、わかりません)。 this thread を参照してください。

2
Gras Double

ジャックのソリューションは私には最適ですが、ネットワークUNCパス(cifs/smb共有)でそれを行う必要があるため、わずかな変更が必要です。

for /R "\\mysrv\imgshr\somedir" %%f in (*.tif) do echo "%%f"

このメソッドの元のヒントは here です

2
Tomsim