74487
Goto Top

CMD per Dir Ordnergrößen ermitteln

Hallo liebe Leute,

ich wollte per CMD-Skript bei Windows mit dem Befehl DIR die Unterordner eines Ordners auflisten lassen und deren Größe (von jeden Unterordner seine Größe) auflisten lassen.

Wie mach ich das am besten?


Danke im Voraus.

Content-Key: 120806

Url: https://administrator.de/contentid/120806

Printed on: April 25, 2024 at 23:04 o'clock

Member: Seardan
Seardan Jul 20, 2009 at 07:03:02 (UTC)
Goto Top
Hallo,

dir /? wäre nicht schlecht face-smile

Wie sieht es mit dir /s /w (eventuell /p) aus

Andreas
Mitglied: 74487
74487 Jul 20, 2009 at 07:06:25 (UTC)
Goto Top
Naja da zeigt er jede Datei an. Ich hätte gerne nur die Ordner mit einer Größe dahinter.
Mitglied: 74487
74487 Jul 20, 2009 at 07:28:20 (UTC)
Goto Top
Hab eine Lösung:

Programm heißt TreeSize.
Member: Seardan
Seardan Jul 20, 2009 at 07:37:14 (UTC)
Goto Top
Wie sieht es mit einem Tool aus! TreeSize ist glaube ich genau das richtige: http://www.chip.de/downloads/TreeSize-Free_13001595.html

Tschau Andreas
Member: bastla
bastla Jul 20, 2009 at 08:03:43 (UTC)
Goto Top
@Seardan
Nur als Anmerkung: Besonders übersichtliche Ergebnisse liefert noch nicht einmal die folgende Variante (von der Kommandozeile, als Batch jeweils mit doppelten %-Zeichen):
for /d %i in ("D:\Ordner\*.*") do @(for /f "delims=" %a in ('dir "%i"^|findstr "Datei(en)"') do @echo %a %i)
Grüße
bastla
Member: pieh-ejdsch
pieh-ejdsch Aug 01, 2009 at 00:25:52 (UTC)
Goto Top
da hab ich noch etwas genaueres...

die wesentlich besseren Ergebnisse jedes (Unter-)ordners in welchen diese Batch ist und ausgeführt wird - wird die komplette Größe ausgegeben. Das mit der GesamtGrößenzusammenrechnung der Einzelordner bekomme ich aber nicht ganz hin. wundert mich sowieso, das CMD mit mehr als 2Gig rechnet zumal ich Files habe die locker über 6GB gehen.

@bastla die CMD lässt sich also durch den Trick mit der IF Bedingung und der Klammer austricksen und rechnet ohne Probleme mit über 4Gig. Normal setzt die dumme Kuh CMD das ja gleich in negative Zahlen um zwischen 2 und 4 Gig und bei über 4 Gig mekerts rum....das Vieh...
vllt spielt die Variablen-Erweiterung auch noch ne zusätzliche Rolle, was ich aber net glaube.

zum Anzeigen der Größe der der Enthaltenen Unterordner eines Ordners einfach den Ordner auf die Batch ziehen...

Ordnergrößen Anzeigen bat
::schnipp------Ordnergroessen Anzeigen.bat
@echo off
if "%~1"=="" (set "pfad=%~dp0" ) else set "pfad=%~1"  
for /d %%i in ("%pfad%*.*") do for /f "tokens=1-3" %%a in ('dir "%%i" /a /s ^|findstr "Datei(en)"') do (set "summ=%%c" & call :zaehl "%%i" )  
for /f "tokens=2,3 delims=?=" %%i in ('set..') do echo %%i   hat: %%j bytes& set /a folders + = 1  
echo %folders% Ordner & pause & goto :eof
:zaehl
if defined "..?%~1" (set /a summend + = %summ:.=%) else set "summend=%summ:.=%"  
set "..?%~1=%summend%"  
::schnapp------Ordnergroessen Anzeigen.bat

Gruß Phil
Member: bastla
bastla Aug 01, 2009 at 00:50:27 (UTC)
Goto Top
@ph
Kurze Anmerkung: Das Eliminieren der Tausendertrennzeichen (=Punkte) aus der Größenangabe kannst Du einsparen, wenn Du den "dir"-Schalter "/-c" verwendest ...

Das Überlisten der 32- bzw 31-Bit-Genauigkeitsgrenze für Berechnungen kann ich allerdings nicht erkennen - für mich sieht es einfach so aus, als würde nur die Gesamtgröße (die letzte Zeile mit "Datei(en)") je Unterverzeichnis gespeichert, aber nicht berechnet (ist allerdings auch schon ziemlich spät heute) ...

Grüße
bastla
Member: pieh-ejdsch
pieh-ejdsch Aug 01, 2009 at 02:08:24 (UTC)
Goto Top
Ok danke Punkte entfernt.....
manchmal mach ich es doch noch ein bissel umständlich! mrgreen

für den test der Berechnung mit der Genauigkeitsgrenze nimmst Du in
Zeile 08 alles VOR der Klammer AUF und alles NACH der Klammer ZU einschliesslich der Klammern weg.
dann ziehst Du ein Laufwerk oder einen Ordner größer als 2 GB auf die Batch. da kommen nur Werte unterhalb 2 GB bzw MINUS 2GB raus.


::schnipp------Ordnergroessen Anzeigen.bat
@echo off
if "%~1"=="" (set "pfad=%~dp0" ) else set "pfad=%~1"  
for /d %%i in ("%pfad%*.*") do for /f "tokens=1-3" %%a in ('dir "%%i" /a /s /-c ^|findstr "Datei(en)"') do (set "summ=%%c" & call :zaehl "%%i" )  
for /f "tokens=2,3 delims=?=" %%i in ('set..') do echo %%i   hat: %%j bytes& set /a folders + = 1  
echo %folders% Ordner& pause & goto :eof
:zaehl
if defined "..?%~1" (set /a summend + = summ) else set "summend=%summ%"  
set "..?%~1=%summend%"  
::schnapp------Ordnergroessen Anzeigen.bat

Gruß Phil
Member: bastla
bastla Aug 01, 2009 at 08:41:44 (UTC)
Goto Top
@ph
Wenn Du allerdings in Zeile 8 den folgenden "else"-Zweig verwendest:
... else (set "summend=%summ%" & echo gesetzt: %summ%)
wirst Du sehen, dass immer "else" ausgeführt wird, und damit nur ein "set", aber keine Berechnung, erfolgt - Grund: "if defined" sucht ja nicht nach der Variablen
..?Unterordner
sondern nach
"..?Unterordner"
und kann diese nicht finden - daher "not defined" ...

... bzw anders rum:
:zaehl
if defined ..?%~1 set ..?%~1
set "summend=%summ%"  
set "..?%~1=%summend%"  
zeigt, dass die Variable nur ohne Anführungszeichen gefunden wird, und auch ohne eine Berechnung jeweils die richtigen Ordnergrößen in der Zusammenfassung enthalten sind (da je Unterordner einfach die ausgelesene, vom "dir"-Befehl gelieferte Gesamtsumme, gespeichert wird).

Nixdestotrotz ist natürlich das Zwischenspeichern der Einzelergebnisse in den jeweiligen "Ordnervariablen" eine schöne Lösung face-smile (die allerdings durch ein vorangestelltes "setlocal" vielleicht noch geringfügig zu verbessern wäre).

Grüße
bastla
Member: pieh-ejdsch
pieh-ejdsch Aug 01, 2009 at 22:17:22 (UTC)
Goto Top
naja da habch mich wohl zu früh gefreut. wegen zusammrechnen.
da hab ich wohl wegen der Variable net genau hingeschaut....

ich arbeite noch an einer Art vom zusammenrechnen der Einzeilgrößen mit zerlegen der Zahl. weil ich das selbst auch benötige....

also reicht das auch so
::schnipp------Ordnergroessen Anzeigen.bat
@echo off & setlocal
if "%~1"=="" (set "pfad=%~dp0" ) else set "pfad=%~1"  
if not "%pfad:~-1%" == "\" set "pfad=%pfad%\"  
for /d %%i in ("%pfad%*.*") do for /f "tokens=1-3" %%a in ('dir "%%i" /a /s /-c ^|findstr "Datei(en)"') do set "..?%%i=%%c"  
for /f "tokens=2,3 delims=?=" %%i in ('set..') do echo %%i   hat: %%j bytes& set /a folders + = 1  
echo %folders% Ordner& pause & goto :eof
::schnapp------Ordnergroessen Anzeigen.bat
Member: pieh-ejdsch
pieh-ejdsch Aug 06, 2009 at 01:50:20 (UTC)
Goto Top
so Jetzt hab ich mal die Berechnung der Gesamtgröße der Einzelnen Ordner zusammengefasst.
dazu musste erst der Größenwert zerlegt werden. somit lassen sich auch Werte bis in den Petabyte bzw bis zum Exabyte zussammenrechnen und darstellen.

::schnipp------Ordnergroessen Anzeigen.bat
@echo off & setlocal & set Fkilo=0& title Ordnergroessen
if "%~1"=="" (set "pfad=%~dp0" ) else set "pfad=%~1"  
if not "%pfad:~-1%" == "\" set "pfad=%pfad%\"  
for /d %%i in ("%pfad%*.*") do for /f "tokens=1-3" %%a in ('dir "%%i" /a /s /-c ^|findstr "Datei(en)"') do set "..?%%~i=%%c"  
for /f "tokens=2,3 delims=?=" %%i in ('set.. 2^>nul') do (echo %%i     hat: %%j bytes& set /a folders + = 1 &call :rechner %%j)  
if defined folders (echo %folders% Ordner in "%pfad%" haben %Fpeta%%Fgiga%%Fkilo% bytes& pause & goto :eof ) else echo "%pfad%" enthaelt keine Ordner!& pause& goto :eof  
:rechner
set /a gignr = 0 , petnr = 0
set alls=%1
if %alls% gtr 999999 (set giga=%alls:~ 0, -6%& set /a gignr + = 1 , kilo = 1%alls:~-6%) else (set /a kilo = %alls:~-6% , giga = 0 , peta = 0 & goto :woutgig )
if %giga% gtr 999999 (set peta=%giga:~ 0, -6%& set /a petnr + = 1 , giga = 1%giga:~-6%) else (set /a giga = %giga:~-6% , peta = 0)
:woutgig
set Falls=%Fpeta%%Fgiga%%Fkilo%
if %Falls% gtr 999999 (set Fgiga=%Falls:~ 0, -6%& set /a Fkilo  = 1%Falls:~ -6% + kilo , gignr + = 1) else (set /a Fkilo = %Falls% + kilo , Fgiga = 0 , Fpeta = 0 )
if %Fgiga% gtr 999999 (set Fpeta=%Fgiga:~ 0, -6%& set /a Fgiga  = 1%Fgiga:~ -6% + giga - gignr + %Fkilo:~ 0, -6% 2>nul , petnr + = 1) else (set /a Fgiga = %Fgiga% + giga - gignr + %Fkilo:~ 0, -6% 2>nul, Fpeta = 0 )
if %Fpeta% gtr 0 set /a Fpeta = Fpeta + peta - petnr + %Fgiga:~ 0, -6% , 
set Fkilo=%Fkilo:~ -6%
if %Fgiga% == 0 (set "Fgiga=") else set Fgiga=%Fgiga:~ -6%  
if %Fpeta% == 0 set "Fpeta="  
goto :eof
::schnapp------Ordnergroessen Anzeigen.bat

Gruß Phil
Member: Metal-PC
Metal-PC Mar 28, 2020 at 07:40:36 (UTC)
Goto Top
Hallo pieh-ejdsch

dieses script von dir
@echo off
if "%~1"=="" (set "pfad=%~dp0" ) else set "pfad=%~1"  
for /d %%i in ("%pfad%*.*") do for /f "tokens=1-3" %%a in ('dir "%%i" /a /s /-c ^|findstr "Datei(en)"') do (set "summ=%%c" & call :zaehl "%%i" )  
for /f "tokens=2,3 delims=?=" %%i in ('set..') do echo %%i   hat: %%j bytes& set /a folders + = 1  
echo %folders% Ordner& pause & goto :eof
:zaehl
if defined "..?%~1" (set /a summend + = summ) else set "summend=%summ%"  
set "..?%~1=%summend%"  

ist im Prinzip fast das was ich gesucht habe.

Habe gestern einige Stunden versucht es anzupassen leider ohne Erfolg.
Demnach die Frage ist es möglich das Script so umzustellen dass die Dateigröße am Anfang steht also "Dateigröße bytes - Verzeichnis Pfad\Datei"
und das Ganze in eine txt Datei gespeichert wird ?
Noch genialer wäre es natürlich wenn es auch für Verzeichnisse mit Unterverzeichnissen die Unterverzeichnisse haben funktionieren könnte. Dann bräuchte man es nur 1x pro Laufwerk ausführen um sich eine Dateiliste anzeigen zu lassen, die nach Größe sortiert ist. Das wäre das Optimum. Würde mich sehr freuen wenn du dich damit nochmal beschäftigen könntest. Vielen Dank im Vorraus und ein schönes und vor allen Dingen gesundes Wochenende
Member: Metal-PC
Metal-PC Mar 30, 2020 at 05:12:15 (UTC)
Goto Top
stelle gerade fest, dass pieh-ejdsch schon länger nicht mehr aktiv zu sein scheint. Evtl kann mir diebzgl. jemand anders helfen ?
Dankende Grüsse
Mitglied: 138701
138701 Apr 27, 2020 at 10:23:01 (UTC)
Goto Top
Ich übernehme ab hier - Hoffentlich bist du noch aktiv hier?
Mitglied: 138701
138701 Apr 27, 2020 updated at 11:43:54 (UTC)
Goto Top
@echo off
for /f "tokens=3" %%i in ('dir /s /a /-c "%~1" ^| findstr "Datei(en)"') do set size=%%i  
exit /b %size%
Ich habe mich ebenfalls informiert, wie es mit VBS, PS und JS machbar ist. Allerdings brauchen alle 3 Systemrechte, die man ihnen nicht so leicht geben kann. Daher ist Batch mal wieder die beste Sprache!