2017-12-22 1 views
2

Ich habe erfolgreich eine Batch-Datei verwendet, die die Gesamtzahl der Dateien und Verzeichnisse in einem Stammverzeichnis zählt.Dateien und Verzeichnisse auf jeder Verzeichnisebene zählen aus einer Batch-Datei

Verzeichnisstruktur:

directory structure

Hier ist das aktuelle Skript: (bekommt die Anzahl der Dateien und Ordner Unterordner bis zum n-ten Kind zurückkehrt).

@echo off 
set "drive=D:\Download\app" 
for /d %%r in ("%drive%\*") do (
    echo Path: %%~fr 
    for /F "tokens=1,2,3 delims= " %%i in ('dir/a/s %%~fr ^| find /i "bytes"') do if "%%j"=="File(s)" (
     set numfiles=%%i 
    )ELSE (
     for /f %%a in ('dir /b /s /ad %%~fr ^|find /c /v "" ') do set numfolders=%%a) 
    echo Files: %numfiles% 
    echo Folds: %numfolders% 
) 

Zuerst wird das Programm gibt die Gesamtzahl der Dateien und Gesamtzahl der Ordner im Stammverzeichnis und dann geht es zum ersten Unterordner und gibt das gleiche für sich ganzen Baum ist, dann ist es an den bewegt nächste Ordner auf dieser Ebene usw.

EDIT

ich das Teil getan habe, wo es auf 1 Ebene des Unterordner gehen und die Gesamtanzahl der Dateien und Ordner bekommen, aber ich will es auf bis N Anzahl der Unterordner, was bedeutet, dass es Gesamtanzahl für jeden einzelnen Ordner im Stammverzeichnis ausgeben sollte.

Hier ist der erweiterte Code.

@echo off 
setLocal EnableDelayedExpansion 
set "drive=C:\Users\%USERNAME%\Downloads\Sandukchi" 
set numfiles= 
set numfolders= 
set count=0; 
for /d %%r in ("%drive%\*") do (
    echo %%r 
    SET /A count=count + 1 
    for /d %%a in ("%%r\*") do set modifiedDate=%%~ta 
    for /F "tokens=1,2,3 delims= " %%i in ('dir/a/s "%%r\*" ^| find /i "File(s)"') do set fileSizeBytes=%%k 
    for %%* in ("%%r") do set folderName=%%~nx* 
    for /F "tokens=1,2,3 delims= " %%i in ('dir/a/s "%%r\*" ^| find /i "bytes"') do if "%%j"=="File(s)" (
     set numfiles=%%i 
    )ELSE (
     for /f %%a in ('dir /b /s /ad "%%r\*" ^|find /c /v "" ') do set numfolders=%%a) 
    echo Last Modified Date: !modifiedDate! 
    echo Folder Size: !fileSizeBytes! KB 
    echo Total Number of Files: !numfiles! 
    echo Total Number of Folders: !numfolders! 
    (
     echo !count! %%r  !folderName!  !modifiedDate! Total Size !fileSizeBytes!KB Total Files !numfiles! Total Folder !numfolders! 
     echo. 
    )>>output.txt 
) 

Antwort

1
@ECHO Off 
SETLOCAL 
SET "sourcedir=." 
SET "tempfile=%temp%\##__##.txt" 
SET "dirname=" 
(
FOR /f "tokens=1,2,*delims= " %%w IN (
'dir /s "%sourcedir%\*" ' 
) DO (
IF "%%w"=="Directory" (
    SET "dirname=%sp256%%%y"&SET /a fcnt=0&SET /a dcnt=-2 
) ELSE (
    FOR /f "delims= " %%p IN ("%%y") DO (
    IF "%%p"=="<DIR>" SET /a dcnt+=1 
) 
) 
IF "%%x"=="File(s)" CALL ECHO %%dirname%%*%%w*%%dcnt%% 
) 
)>"%tempfile%" 
FOR /f "tokens=1,2,*delims=*" %%a IN ('sort "%tempfile%"') DO ECHO directory %%a&ECHO  files %%b&echo subdirs %%c 

GOTO :EOF 

Sie müssten die Einstellung von sourcedir zu ändern, um Ihre Umstände anzupassen.

Erzeugt eine temporäre Datei. Es wurde kein Versuch unternommen, die temporäre Datei zu löschen, da sie nützliche Daten enthalten kann.

Run ein Standard dir/s Befehle und die Linien, die directory beginnen auszusuchen (die einen neuen Verzeichnisnamen bezeichnet), und solche, bei denen die dritten Leerzeichen getrennten Token <DIR> zum Zählen Unterverzeichnisse sind. Wenn die Zeilen mit dem zweiten Token File(s) angezeigt werden, geben Sie den Namen, den Dateicount und den Verzeichniscount in eine temporäre Datei ein.

Sortieren Sie die Tempdatei und Bericht.

Hinweis: %%y enthält das dritte Token ab jeder Zeile. Dies wird erneut aktiviert, indem nur das erste Token (Standard) auf %%p ausgewählt wird, das das dritte Token der ursprünglichen Zeile isoliert.

Die temporäre Datei wird mit * als Trennzeichen erstellt, da * kein gültiges Dateiname ist.

dcnt auf -2 stellen Sie die Count-of-Verzeichnisse zu starten, da beide . und .. wie in einem dir /s und Ordner gemeldet werden.

+0

Es ist perfekt funktioniert, aber es ist nicht Gesamtzahl der Unterverzeichnisse zeigt. es zeigt weiter -2. – Ebadali

+0

Dies bedeutet, dass "DCNT" nicht inkrementiert wird.Es könnte sein, dass '%% p' niemals auf'

'gesetzt wird oder es einen Übertragungsfehler gibt (am besten zum Ausschneiden und Einfügen). Wenn du %% p> con: 'innerhalb des' do' Blocks für 'für ... %% p ...' redest, solltest du sehen, was in '%% p' gesetzt ist. Die Anzeige von '%% y' kann ähnlich hilfreich sein. – Magoo

1

einen Versuch für diesen Code geben:

@echo off 
Setlocal EnableDelayedExpansion 
@For /D %%D in (*) DO (
    Set "Folder=%%~D" 
    PUSHD "!Folder!" 
     FOR /F %%H in ('dir /a-d /b 2^>NUL^|find /C /V "" ') DO (Set "numFiles=%%H") 
     FOR /F %%I in ('dir /ad /b 2^>NUL^|find /C /V "" ') DO (Set "numSubFolders=%%I") 
    POPD 
    echo The Folder "!Folder!" has !numSubFolders! SubFolders and !numFiles! Files  
    ) 
) 
pause & exit 
Verwandte Themen