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