Plik wsadowy systemu Windows zapętla się przez katalogi, aby przetwarzać pliki?

OK, jestem programistą PHP i niestety, z powodów, których Nie będę ogłaszał dla zwięzłości, muszę napisać / użyć pliku wsadowego, który przetwarza dla mnie niektóre obrazy.

Mam jeden folder pełen zagnieżdżonych folderów, wewnątrz każdego z tych zagnieżdżonych folderów jest jeszcze jeden folder, który zawiera liczbę obrazów TIF, Liczba obrazów różni się w każdym folderze. Mam też plik wsadowy, nazwijmy go ProcessImages.bat Dla Windows, na którym można "upuścić" te pliki TIF (lub oczywiście określić je w lista wiersza poleceń podczas wywoływania bat); na którym tworzy nowy folder z wszystkimi moimi obrazami na podstawie EXE, który mam.

Dobrą rzeczą jest to, że ponieważ plik bat używa ścieżki z folderów, które "upuszczasz" na niego, mogę wybrać wszystkie Tify jednego folderu i upuścić go, aby wykonać przetwarzanie... ale jak nadal ręcznie zrobić to dla 300 lub tak foldery TIFs mam znalazłem to błoto mój system w dół tak niewiarygodnie i gdybym mógł tylko przetwarzać te jeden na raz (bez ręcznie robiąc to) byłoby wspaniale.

Wszystko to powiedziane... czy ktoś mógłby mi wskazać właściwy kierunek (dla amatora plików Windows bat) w taki sposób, że mogę napisać skrypt Windows bat, który mogę wywołać z wewnątrz katalogu i mieć go przemierzającego wszystkie katalogi zawarte w tym katalogu... i uruchamiać mój plik wsadowy przetwarzania na każdym zestawie obrazów po kolei?

Z góry dzięki!

Tyler

Author: Tyler, 2011-12-06

4 answers

Możesz napisać rekurencyjny algorytm wsadowy, który daje ci dokładną kontrolę nad tym, co robisz w każdym zagnieżdżonym podkatalogu:

@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
 75
Author: Aacini,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-06 10:47:28

Rozwiązanie Aaciniego działa, ale można to zrobić w jednej linijce:

for /R %%f in (*.tif) do echo "%%f"
 47
Author: Jack Allan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-19 10:51:06

Wiem, że to nie jest rekurencja (iteracja przez podkatalogi wyliczeniowe?), ale może działać lepiej dla niektórych aplikacji:

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

Zastąp trzeci wiersz poleceniem, które może być potrzebne.

dir / ad - Lista tylko katalogów

Najfajniejsze jest to, że pushd nie potrzebuje cudzysłowów, jeśli spacje w path.

 2
Author: Manicalic,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-25 11:47:56

Zamieszczanie tutaj, ponieważ wydaje się być najpopularniejszym pytaniem w tej sprawie.

Oto Stary klejnot, który w końcu udało mi się znaleźć w internecie: zamiataj.exe.
wykonuje podaną komendę w bieżącym katalogu i wszystkich podkatalogach, po prostu.


Załóżmy, że masz jakiś program, który przetwarza wszystkie pliki w katalogu (ale przypadki użycia są naprawdę znacznie szersze):

:: For example, a file C:\Commands\processimages.cmd which contains:
FOR %%f IN (*.png) DO whatever

Więc chcesz uruchomić ten program w bieżący katalog i wszystkie podkatalogi:

:: 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


plusy: nie musisz zmieniać oryginalnego programu, aby przetwarzał podkatalogi. Możesz przetwarzać podkatalogi tylko wtedy, gdy tego chcesz. A to polecenie jest tak proste i przyjemne w użyciu.

Con: może zawieść niektóre polecenia(zawierające spacje, cudzysłowy, Nie wiem). Zobacz ten wątek na przykład.

 2
Author: Gras Double,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-01 01:40:14