Mit dem gleichen Ansatz
@echo off
setlocal enableextensions disabledelayedexpansion
for /d %%a in (*) do for /f "tokens=1,5" %%b in ('
dir /a-d "%%~fa\*" 2^> nul ^| findstr /b /c:" " ^|^| echo 0
') do if "%%c"=="" echo %%~fa : %%b
Dieser Wille
- Nehmen Sie für jeden Ordner (
for /d) eine Referenz und speichern Sie sie in einem %%aaustauschbaren Parameter
- Führen Sie einen
dirBefehl mit dem vollständigen Pfad des Ordners aus%%~fa
- Verwenden Sie eine Pipe (
|), um die Liste zu filtern und nur die Zeilen abzurufen, die mit zwei Leerzeichen beginnen (die Fußzeilen).
- Wenn keine Zeilen gefunden werden (dh der
dirBefehl ist fehlgeschlagen), wird eine 0 ausgegeben
- Die von der erzeugten Zeilen
dir | findstrwerden mit einem for /fBefehl behandelt. Wir werden das erste Token (die Anzahl der Dateien in der abgesetzten Zeile) und das fünfte Token (nur in der Fußzeile mit den Verzeichnisinformationen vorhanden) lesen.
- Wenn das fünfte Element leer ist, enthält diese Zeile Informationen zu den Dateien und nicht zu den Ordnern. Geben Sie daher den Ordnerpfad und die darin enthaltenen Dateien als Echo ein
Das Problem bei diesem Ansatz ist, dass das dir | findstrfür jeden der Unterordner ausgeführt wird. Für eine schnellere Lösung
robocopy . . /l /nocopy /is /e /nfl /lev:2 /njh /njs
Dies ruft einfach auf robocopy, aber anstatt irgendetwas zu kopieren, fordern wir an, dass nichts kopiert wird und geben nur die Liste zurück, was verarbeitet werden soll ( /nocopy /l). Wir bitten Sie, aus dem aktuellen Ordner in den aktuellen Ordner zu kopieren, einschließlich identischer Dateien im Prozess ( /is), leere Unterordner zu verarbeiten ( /eum Ordner mit 0 Dateien einzuschließen), aber nur zwei Ebenen zu verarbeiten ( /lev:2den aktuellen Ordner und den darunter liegenden). ohne Generierung einer Dateiliste ( /nfl), ohne Jobheader ( /njh) und ohne Jobübersicht ( /njs)
Das Ergebnis ist dieselbe Liste, jedoch mit dem Ordnernamen und der Anzahl der Dateien in geänderten Spalten
So behalten Sie das ursprüngliche Ausgabeformat bei
@echo off
setlocal enableextensions disabledelayedexpansion
for /f "tokens=1,*" %%a in ('
robocopy . . /l /nocopy /is /e /nfl /lev:2 /njh /njs
') do echo %%~fb : %%a
Mit a for /fwird der vorherige robocopyBefehl verarbeitet, wobei die Zeile in zwei Token aufgeteilt wird. Der erste Befehl enthält die Anzahl der Dateien und wird in gespeichert. %%aDer zweite Befehl enthält den Rest der Zeile und wird in gespeichert %%b. Für jede Zeile in der Ausgabe des inneren robocopyBefehls wird der Code in der doKlausel ausgeführt: Geben Sie einfach ein Echo ein, um die beiden Token in umgekehrter Reihenfolge zu trösten.