Windows Batch File Looping по каталогам для обработки файлов? - PullRequest
34 голосов
/ 06 декабря 2011

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

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

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

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

Заранее спасибо!

Tyler

Ответы [ 5 ]

84 голосов
/ 06 декабря 2011

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

@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
56 голосов
/ 19 августа 2014

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

for /R %%f in (*.tif) do echo "%%f"
2 голосов
/ 25 ноября 2016

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

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

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

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

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

2 голосов
/ 07 ноября 2015

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

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

1 голос
/ 07 ноября 2018

Решение Джека работает лучше всего для меня, но мне нужно сделать это для сетевого UNC-пути (общий ресурс cifs / smb), поэтому требуется небольшое изменение:

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

Оригинальный совет для этого метода здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...