Schneller (er) Weg, um die Ordnergröße mit Batch-Skript zu erhalten

BITTE LESEN SIE UNTEN DIE URSPRÜNGLICHE FRAGE FÜR EINIGE TESTVERGLEICHE VERSCHIEDENER WEGE:

So habe ich bisher 2 Wege ausprobiert:

1.Mit dem Code von @ durch das Verzeichnis navigierOrdnergröße von der Windows-Befehlszeile abrufen :

@echo off
set size=0
for /r %%x in (folder\*) do set /a size+=%%~zx
echo %size% Bytes

2. Ausgabe eines @ speiche

'dir %folder% /s /a'  

in eine Textdatei und lese dann die Größe unten ein

3.Die letzte Möglichkeit, die ich derzeit versuche, ist die Verwendung von du (Festplattendienstprogramm von MS -https: //technet.microsoft.com/en-us/sysinternals/bb896651.asp).

Now mit Ausnahme von # 3 scheinen beide Methoden viel zu langsam für das zu sein, was ich brauche (Hunderttausende von Dateien). Die Frage ist also, welche davon die schnellste ist / sein sollte und ob es andere schnelle (er) Möglichkeiten gibt, die Größe von Ordnerinhalten mit mehr als 100.000 Dateien zu ermitteln (und es gibt Hunderte von Ordnern).

START EDIT:

Below ist meine sehr hackige Art, den Vergleich durchzuführen (habe mein Programm abgeschlachtet, um einige Ausgaben zu sehen)
Es gibt einige kleine Fehler, bei denen Teile wie Option 3 fehlschlagen, da versucht wird, eine Zahl zu verarbeiten, die größer als das 32-Bit-Limit ist, und ich bin mir sicher, dass es noch einige weitere Probleme gibt, aber die allgemeinen Zeiten, die ich denke, sind offensichtlich, es sei denn, ich bin wirklich meine Logik durcheinander gebracht.

Option I: Durchsuche Verzeichnisse, benutze VB-Skript, um die Textausgabe von 'dir' einzulesen und suche die Größe am Ende + konvertiere sie in MB (ursprünglich habe ich sie von einer anderen Stelle bekommen, an der ich tatsächlich den Ort verloren habe, an dem ich sie erhalten habe) it from) Option II: Iterieren Sie mit findstr pipe und geben Sie das Ergebnis direkt aus (keine Konvertierung in MB) - from @MC ND Option III: Verwenden Sie den Befehl compact, um iterieren - from @npocmaka Option IV: from @ user1016274 - using robocoby

(Es gibt noch einige Antworten, aber diese habe ich einfließen lassen)

Dies sind die Ergebnisse, die ich bekommen habe, und sie sind ziemlich konsistent in Bezug auf die Relevanz zueinander, Robocopy bläst sie weg

Option I und Option II lagen normalerweise nahe beieinander, wobei Option II etwas besser war (zwischen 1 Minute und 10 Sekunden zwischen 2 Minuten und 10 Sekunden, nicht sicher, woher der Unterschied stammt). Teil III - 16-17 Minuten Teil IV - 10-20 Sekunden

@echo OFF
setlocal enabledelayedexpansion

REM OPTION I - directory iteration
REM OPTION II - iteration with findstr pipe
REM OPTION III - compact

:MAIN
REM Initialize log filename
for /f "delims=" %%a in ('echo %date:~10,4%%date:~4,2%%date:~7,2%%time:~0,2%%time:~3,2%%time:~6,2%') do @set LOGFILEPOSTFIX=%%a
set LOGFILEPOSTFIX=%date:~10,4%%date:~4,2%%date:~7,2%%time:~0,2%%time:~3,2%%time:~6,2%
set TIMESTAMP=%date:~10,4%_%date:~4,2%_%date:~7,2%_%time:~0,2%_%time:~3,2%_%time:~6,2%
echo %TIMESTAMP% 
set "LOGFILE=Proj_not_in_db_%LOGFILEPOSTFIX%.log"


set option=1
set TIMESTAMP=%date:~10,4%_%date:~4,2%_%date:~7,2%_%time:~0,2%_%time:~3,2%_%time:~6,2%
echo %TIMESTAMP% - PART I ---- Directory Listing into file, iterate through the sizes of all files inside folder >> %LOGFILE%
echo %TIMESTAMP% - PART I
call :PROCESSFOLDER
set TIMESTAMP=%date:~10,4%_%date:~4,2%_%date:~7,2%_%time:~0,2%_%time:~3,2%_%time:~6,2%
echo %TIMESTAMP% - PART I ---- END >> %LOGFILE%
echo %TIMESTAMP% - PART I - END
set option=2
set TIMESTAMP=%date:~10,4%_%date:~4,2%_%date:~7,2%_%time:~0,2%_%time:~3,2%_%time:~6,2%
echo %TIMESTAMP% - PART II  findstr pipe ---- >> %LOGFILE%
echo %TIMESTAMP% - PART II
call :PROCESSFOLDER
set TIMESTAMP=%date:~10,4%_%date:~4,2%_%date:~7,2%_%time:~0,2%_%time:~3,2%_%time:~6,2%
echo %TIMESTAMP% - PART II ---- END>> %LOGFILE%
echo %TIMESTAMP% - PART II - END
set option=3
set TIMESTAMP=%date:~10,4%_%date:~4,2%_%date:~7,2%_%time:~0,2%_%time:~3,2%_%time:~6,2%
echo %TIMESTAMP% - PART III compact ---- >> %LOGFILE%
echo %TIMESTAMP% - PART III
call :PROCESSFOLDER
set TIMESTAMP=%date:~10,4%_%date:~4,2%_%date:~7,2%_%time:~0,2%_%time:~3,2%_%time:~6,2%
echo %TIMESTAMP% - PART III ---- END>> %LOGFILE%
echo %TIMESTAMP% - PART III - END
set option=4
set TIMESTAMP=%date:~10,4%_%date:~4,2%_%date:~7,2%_%time:~0,2%_%time:~3,2%_%time:~6,2%
echo %TIMESTAMP% - PART IV robocopy ---- >> %LOGFILE%
echo %TIMESTAMP% - PART IV
call :PROCESSFOLDER

call :CLEANUP
echo FINAL
pause
goto :EOF

:PROCESSFOLDER

    echo C:\Windows
    echo Processing C:\Windows >>  %LOGFILE%
    break > projects_in_folder.tmp
    for /f "tokens=1-4,* SKIP=7" %%b IN ('dir "C:\Windows" /Q /TW /AD') do (
        set _folder=%%f
        REM Don't write the 2 lines at the end displaying summary information
        if NOT "%%e" EQU "bytes" (
            SET _folder=!_folder:~23!
            echo !_folder!,%%b>> projects_in_folder.tmp
        )   
    )
    set "folder_path=C:\Windows"
    call :COMPARE
goto :EOF

:COMPARE
set file_name=%folder_path:\=_%
break > "%file_name%.txt"
if %option%==4 (
    set "full_path=C:\Windows"
    call :GETFOLDERINFO4
    set TIMESTAMP=%date:~10,4%_%date:~4,2%_%date:~7,2%_%time:~0,2%_%time:~3,2%_%time:~6,2%
    echo %TIMESTAMP% - PART IV ---- END>> %LOGFILE%
    echo %TIMESTAMP% - PART IV - END
)


for /f "tokens=1,2* delims=," %%a in (projects_in_folder.tmp) do (
    for /f "tokens=1,* delims=_" %%x in ("%%a") do (
        set "projcode=%%x"
    )
    set full_path=%folder_path%\%%a
    if %option%==1 call :GETFOLDERINFO 
    if %option%==2 call :GETFOLDERINFO2
    if %option%==3 call :GETFOLDERINFO3

    echo PROJ: %%a SIZE: !totalsize! LASTMODIFIED: %%b >> %LOGFILE%
)
goto :EOF

:GETFOLDERINFO2
set "size=0"
set target=!full_path!
for /f "tokens=3,5" %%a in ('
    dir /a /s /w /-c "%target%"
    ^| findstr /b /l /c:"  "
    ') do if "%%b"=="" set "size=%%a"
echo %size%
set totalsize=%size%
goto :EOF

:GETFOLDERINFO4
pushd "%full_path%" || goto :EOF
setlocal

for /f "tokens=1-10,* delims= " %%a in ('
    robocopy %full_path% %TEMP% /S /L /BYTES /XJ /NFL /NDL /NJH ^| find "Bytes"
') do echo %full_path%: %%c
popd    
goto :EOF

:GETFOLDERINFO
set totalsize=0
dir "%full_path%" /s /a > size.txt 
REM Run VBScript that outputs size in MB which is saved
pushd %~dp0
start /b "" cscript /nologo foldersize.vbs
FOR /F "usebackq tokens=*" %%r in (`CSCRIPT "foldersize.vbs"`) DO SET totalsize=%%r
echo bla > nul
goto :EOF

:GETFOLDERINFO3
set "last=#"
set "_size="
for /f "tokens=1 delims= " %%s in ('compact /s:"%full_path%" /q ') do (
        set "_size=!last!"
        set "last=%%s"
)
set "_size=%_size:  =%"
set "_size=%_size: =%"
set "_size=%_size:.=%"
set "_size=%_size:,=%"
set "_size=%_size:      =%"
echo folder size is : %_size% bytes
set totalsize=%_size%
goto :EOF


:CLEANUP

DEL /Q /S projects_in_folder.tmp
DEL /Q /S size.txt
goto :EOF

Antworten auf die Frage(12)

Ihre Antwort auf die Frage