Запуск пакетного файла Windows через каталоги для обработки файлов?

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

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

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

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

Спасибо заранее!

Тайлер

Ответ 1

Вы можете написать рекурсивный алгоритм в 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

Ответ 2

Решение Aacini работает, но вы можете сделать это в одной строке:

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

Ответ 3

Я знаю, что это не рекурсия (итерация через перечислимые подкаталоги?), но она может работать лучше для некоторых приложений:

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

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

dir/ad - список только каталогов

В классной вещи pushd не нужны кавычки, если пробелы в пути.

Ответ 4

Проводка здесь, как кажется, самый популярный вопрос об этом случае.

Вот старый камень, который мне наконец удалось найти в Интернете: 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: Невозможно выполнить некоторые команды (содержащие пробелы, кавычки, я не знаю). См. этот поток, например.