webentwicklung-frage-antwort-db.com.de

Wie Sie alle Ordner mit der Größe über die Batch-Datei auflisten

Ich möchte eine einfache Lösung für die Liste der Ordner und deren Größe im TXT- oder CSV-Format.

Ich benutze diesen Code für die Ordnerliste

dir C:\Temp\*.* /b /a:d > C:\folderList.txt

aktueller Output

<<folderList.txt>>
folder1
folder2
folder3

gewünschte Ausgabe

<<folderList.txt>>
folder1 # 100 MB
folder2 # 30 MB
folder3 # 110 MB

Es würde einfach die Größe jedes Ordners generieren ... Wie kann ich vorgehen? irgendeine Hilfe

10
goldenbutter

Verwenden Sie für jeden Ordner in der Liste den Befehl dir, um die Größe der Dateien unter dem Ordner abzurufen

@echo off
    setlocal disabledelayedexpansion

    set "folder=%~1"
    if not defined folder set "folder=%cd%"

    for /d %%a in ("%folder%\*") do (
        set "size=0"
        for /f "tokens=3,5" %%b in ('dir /-c /a /w /s "%%~fa\*" 2^>nul ^| findstr /b /c:"  "') do if "%%~c"=="" set "size=%%~b"
        setlocal enabledelayedexpansion
        echo(%%~nxa # !size!
        endlocal
    )

    endlocal

Es durchläuft den angegebenen Ordner (wird als Parameter an die Stapeldatei übergeben oder, wenn kein Parameter vorhanden ist, das aktuelle Verzeichnis). 

Für jeden Ordner in diesem Ordner (for /d) wird ein rekursiver dir-Befehl innerhalb des inneren for-Befehls ausgeführt, und von dessen Ausgabe aus wird die Summenzeile am Ende (durch findstr extrahiert) analysiert (der tokens in for-Befehl) und die Gesamtgröße von Alle Dateien in diesem Unterordner werden abgerufen. Dann wird der Name (und die Erweiterung, falls vorhanden) des Ordners und die Größe der Elemente darunter in der Konsole angezeigt.

Wenn eine Datei erstellt werden muss, leiten Sie die Ausgabe des Stapels in eine Datei um

getSizes.cmd "c:\temp" > C:\folderList.txt
17
MC ND

Mit MC NDs hervorragendem Code habe ich die Konvertierung in Kb, Mb, Gb usw. hinzugefügt. Nur für den Fall, dass Sie es lieber in diesen Formaten hätten. 

@echo off
setlocal disabledelayedexpansion

set "folder=%~1"
  if not defined folder set "folder=%cd%"

    for /d %%a in ("%folder%\*") do (
        set "size=0"
        for /f "tokens=3,5" %%b in ('dir /-c /a /w /s "%%~fa\*" 2^>nul ^| findstr /b /c:"  "') do if "%%~c"=="" set "size=%%~b"
        setlocal enabledelayedexpansion
        call :GetUnit !size! unit
        call :ConvertBytes !size! !unit! newsize
        echo(%%~nxa - !newsize! !unit!
        endlocal
    )

endlocal
exit /b

:ConvertBytes bytes unit ret
setlocal
if "%~2" EQU "KB" set val=/1024
if "%~2" EQU "MB" set val=/1024/1024
if "%~2" EQU "GB" set val=/1024/1024/1024
if "%~2" EQU "TB" set val=/1024/1024/1024/1024
> %temp%\tmp.vbs echo wsh.echo FormatNumber(eval(%~1%val%),1)
for /f "delims=" %%a in ( 
  'cscript //nologo %temp%\tmp.vbs' 
) do endlocal & set %~3=%%a
del %temp%\tmp.vbs
exit /b


:GetUnit bytes return
set byt=00000000000%1X
set TB=000000000001099511627776X
if %1 LEQ 1024 set "unit=Bytes"
if %1 GTR 1024   set "unit=KB"
if %1 GTR 1048576  set "unit=MB"
if %1 GTR 1073741824  set "unit=GB"
if %byt:~-14% GTR %TB:~-14% set "unit=TB"
endlocal & set %~2=%unit%
exit /b
11
Matt Williamson

wenn Sie Windows 7 oder neu verwenden, verwenden Sie Powershell und geben Sie den Befehl Befehl 

ls- r >> log.txt

es werden alle Dateien im aktuellen Verzeichnis sowie die Dateigröße in Bytes für die Protokolldatei aufgelistet. 

1
Ketan Verma

Mein JREN.BAT-Dienstprogramm kann verwendet werden, um eine Liste von Ordnern mit Größen zu erhalten. Es ist ein hybrides JScript/Batch-Skript, das ab XP nativ auf jedem Windows-Computer ausgeführt wird.

JREN konvertiert nicht bequem in MB (oder eine andere Einheit) - es listet einfach die Größe in Bytes auf. Es ist jedoch sicher (und vergleichsweise schnell), um die Auflistung zu erhalten:

jren "$" "' # '+size()" /d /j /list /p "d:\temp" >"C:\folderList.txt"

Sie sollten in Betracht ziehen, die Ordnergröße zuerst auf eine feste Breite zu setzen, die den größten Ordner überschreitet, gefolgt vom Ordnernamen. Ich finde dieses Format viel einfacher zu lesen und es ist immer noch leicht zu analysieren:

jren "^" "size('               ')+'  '" /d /j /list /p "d:\temp" >"C:\folderList.txt"

Die Ausgabe würde ungefähr so ​​aussehen

           1852  SomeFolderName
        1616869  Another folder name
         137764  yetAnother

Da es sich bei JREN um eine Batchdatei handelt, müssen Sie CALL JREN verwenden, wenn Sie den Befehl in ein anderes Batchskript einfügen.

1
dbenham

probiere sed für Windows:

dir /-c /a /w /s|sed -nr "/:$/q;/:/h;/^\s+[0-9]/{s/.*[^0-9]([0-9]+.*)/\1/;H;g;s/\n/ /p}"
0
Endoro

Ich nahm @Matt Williamsons Code und ließ ihn jede Zeile in eine .csv-Datei im Ausführungsverzeichnis folderSizes.csv exportieren. Es stellt die volle Byte-Größe als Spalte bereit, damit Sie in Excel (oder was auch immer) problemlos sortieren können.

@echo off
echo Getting folder sizes for you...storing to folderSizes.csv
setlocal disabledelayedexpansion
if EXIST folderSizes.csv del folderSizes.csv
echo Folder,Bytes Size,Short Size > folderSizes.csv

set "folder=%~1"
  if not defined folder set "folder=%cd%"

    for /d %%a in ("%folder%\*") do (
        set "size=0"
        for /f "tokens=3,5" %%b in ('dir /-c /a /w /s "%%~fa\*" 2^>nul ^| findstr /b /c:"  "') do if "%%~c"=="" set "size=%%~b"
        setlocal enabledelayedexpansion
        call :GetUnit !size! unit
        call :ConvertBytes !size! !unit! newsize
        echo(%%~nxa,!size!,!newsize!!unit! >> folderSizes.csv
        endlocal 
    )

endlocal
exit /b

:ConvertBytes bytes unit ret
setlocal
if "%~2" EQU "KB" set val=/1024
if "%~2" EQU "MB" set val=/1024/1024
if "%~2" EQU "GB" set val=/1024/1024/1024
if "%~2" EQU "TB" set val=/1024/1024/1024/1024
> %temp%\tmp.vbs echo wsh.echo FormatNumber(eval(%~1%val%),1)
for /f "delims=" %%a in ( 
  'cscript //nologo %temp%\tmp.vbs' 
) do endlocal & set %~3=%%a
del %temp%\tmp.vbs
exit /b


:GetUnit bytes return
set byt=00000000000%1X
set TB=000000000001099511627776X
if %1 LEQ 1024 set "unit=Bytes"
if %1 GTR 1024   set "unit=KB"
if %1 GTR 1048576  set "unit=MB"
if %1 GTR 1073741824  set "unit=GB"
if %byt:~-14% GTR %TB:~-14% set "unit=TB"
endlocal & set %~2=%unit%
exit /b
0
Leland