wake-up-neo.com

Windows-Batch-Datei Durchsuchen von Verzeichnissen zur Verarbeitung von Dateien?

Okay, ich bin ein PHP -Programmierer und leider, aus Gründen, die ich der Kürze halber nicht bekannt geben werde, muss ich eine Batch-Datei schreiben/verwenden, die einige Bilder für mich verarbeitet. 

Ich habe einen Ordner voller verschachtelter Ordner. In jedem dieser verschachtelten Ordner befindet sich ein weiterer Ordner, der eine Anzahl von TIF-Bildern enthält. Die Anzahl der Bilder variiert in jedem Ordner. Ich habe auch eine Batch-Datei, nennen wir sie ProcessImages.bat für Windows, in der Sie diese TIF-Dateien "ablegen" können (oder offensichtlich in einer Befehlszeilenliste angeben, wenn Sie den bat aufrufen). Daraufhin wird ein neuer Ordner mit all meinen Images erstellt, basierend auf einer EXE-Datei, die ich habe.

Das Gute ist, dass, da die bat-Datei den Pfad aus den Ordnern verwendet, auf die Sie "abgelegt" haben, ich alle TIFs eines Ordners auswählen und ablegen kann, um die Verarbeitung auszuführen Die 300 Ordner von TIFs, die ich besitze, finde ich unfassbar, und wenn ich diese nur auf einmal bearbeiten könnte (ohne es manuell zu tun), wäre es wunderbar.

Alles in allem ... könnte jemand mich in die richtige Richtung (für eine Windows-BAT-Datei AMATEUR) zeigen, so dass ich ein Windows-BAT-Skript schreiben kann, das ich aus einem Verzeichnis heraus aufrufen und durch ALLE darin enthaltenen Verzeichnisse ziehen lassen kann dieses Verzeichnis ... und meine Verarbeitungsstapeldatei für jeden Satz von Bildern nacheinander ausführen?

Danke im Voraus!

Tyler

33
Tyler

Sie können in Batch einen rekursiven Algorithmus schreiben, mit dem Sie genau steuern können, was Sie in jedem verschachtelten Unterverzeichnis tun:

@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
83
Aacini

Die Lösung von Aacini funktioniert, aber Sie können es in einer Zeile machen:

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

Ich weiß, dass dies keine Rekursion ist (Iteration durch aufgezählte Unterverzeichnisse?), Aber es kann für einige Anwendungen besser funktionieren:

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

Ersetzen Sie die 3. Zeile durch den gewünschten Befehl.

dir/ad - listet nur Verzeichnisse auf

Die coole Sache ist pushd braucht keine Anführungszeichen für Leerzeichen im Pfad.

2
Manicalic

Posting hier, da es die beliebteste Frage zu diesem Fall zu sein scheint.

Hier ist ein alter Edelstein, den ich endlich im Internet gefunden habe: sweep.exe
Es führt den bereitgestellten Befehl im aktuellen Verzeichnis und in allen Unterverzeichnissen aus, ganz einfach.


Nehmen wir an, Sie haben ein Programm, das alle Dateien in einem Verzeichnis verarbeitet (die Anwendungsfälle sind jedoch sehr viel breiter als diese):

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

Sie möchten dieses Programm also im aktuellen Verzeichnis und allen Unterverzeichnissen ausführen:

:: 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: Sie müssen Ihr ursprüngliches Programm nicht ändern, um Unterverzeichnisse verarbeiten zu können. Sie haben die Wahl, die Unterverzeichnisse nur dann zu bearbeiten, wenn Sie dies wünschen. Und dieser Befehl ist so unkompliziert und angenehm zu bedienen.

Con: Könnte bei einigen Befehlen fehlschlagen (Leerzeichen, Anführungszeichen, ich weiß es nicht). Siehe diesen Thread zum Beispiel.

2
Gras Double

Jacks Lösung funktioniert am besten für mich, aber ich muss es für den Netzwerk-UNC-Pfad tun (cifs/smb share). Daher ist eine geringfügige Änderung erforderlich:

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

Der Originaltipp für diese Methode ist hier

0
Tomsim