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