2011-12-06 2 views
24

Хорошо, я программист PHP, и, к сожалению, по причинам, которые я не буду объявлять для краткости, мне нужно написать/использовать пакетный файл, который обрабатывает некоторые изображения для меня.Windows Batch File Looping через каталоги для обработки файлов?

У меня есть одна папка, полная вложенных папок, внутри каждой из этих вложенных папок есть еще одна папка, содержащая несколько изображений TIF, количество изображений меняется в каждой папке. У меня также есть пакетный файл, который позволяет называть ProcessImages.bat для Windows, что вы можете «отбрасывать» эти файлы TIF (или явно указывать их в списке командной строки при вызове бита); на котором он создает новую папку со всеми процессами моих изображений на основе EXE, который у меня есть.

Хорошо, что, поскольку файл bat использует путь из папок, которые вы «бросаете» на него, я могу выбрать все TIF одной папки и отбросить его для обработки ... но по мере того, как я продолжаю вручную сделайте это для 300 или около того папок TIF. У меня есть, что я нахожу, что он боксирует мою систему так невероятно, и если бы я мог обрабатывать только один из них (без ручного выполнения), это было бы замечательно.

Все, что сказал ... может кто-то указать мне в правильном направлении (для файла bat bat AMATURUR), чтобы я мог написать сценарий летучей мыши Windows, который я могу вызвать изнутри каталога и пропустить его через ВСЕ каталоги, содержащиеся внутри этого каталога ... и запускать мой пакетный пакет обработки по каждому набору изображений по одному за раз?

Заранее благодарен!

Тайлер

ответ

67

Вы можете написать рекурсивный алгоритм в Batch, который дает вам точный контроль того, что вы делаете в каждой вложенной поддиректории:

@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 работает, но вы можете сделать это в одной строке:

for /R %%f in (*.tif) do echo "%%f" 
+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 


Pros: Вы не должны изменить свою оригинальную программу, чтобы я 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 
) 

Замените третью строку любой командой, которая может вам понадобиться.

реж/объявления - список только каталоги

Прохладная вещь Pushd не нуждается в кавычки, если пробелы в пути.

Смежные вопросы