Abrufen der Ordnergröße über die Windows-Befehlszeile


128

Ist es in Windows möglich, die Größe eines Ordners über die Befehlszeile abzurufen, ohne ein Tool eines Drittanbieters zu verwenden?

Ich möchte das gleiche Ergebnis erzielen, das Sie erhalten würden, wenn Sie mit der rechten Maustaste auf den Ordner im Windows Explorer → Eigenschaften klicken.

Antworten:


120

Sie können Größen einfach rekursiv addieren (das Folgende ist eine Batch-Datei):

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

Dies hat jedoch mehrere Probleme, da cmdes auf 32-Bit-Ganzzahlarithmetik mit Vorzeichen beschränkt ist. So wird es Größen über 2 GiB falsch 1 bekommen . Darüber hinaus werden Symlinks und Junctions wahrscheinlich mehrmals gezählt, sodass es sich bestenfalls um eine Obergrenze handelt, nicht um die wahre Größe (dieses Problem tritt jedoch bei jedem Tool auf).

Eine Alternative ist PowerShell:

Get-ChildItem -Recurse | Measure-Object -Sum Length

oder kürzer:

ls -r | measure -sum Length

Wenn Sie es schöner wollen:

switch((ls -r|measure -sum Length).Sum) {
  {$_ -gt 1GB} {
    '{0:0.0} GiB' -f ($_/1GB)
    break
  }
  {$_ -gt 1MB} {
    '{0:0.0} MiB' -f ($_/1MB)
    break
  }
  {$_ -gt 1KB} {
    '{0:0.0} KiB' -f ($_/1KB)
    break
  }
  default { "$_ bytes" }
}

Sie können dies direkt verwenden von cmd:

powershell -noprofile -command "ls -r|measure -sum Length"

1 Ich habe irgendwo eine teilweise fertiggestellte Bignum-Bibliothek in Batch-Dateien, die zumindest eine Ganzzahladdition mit beliebiger Genauigkeit richtig macht. Ich sollte es wirklich veröffentlichen, denke ich :-)


+1 Ich bin gerade in der Get-Help * -Ausgabe herumgewandert, um so etwas zu finden.
Steve

2
Steve, in meinen Augen ist PowerShell viel mehr Unix-y als Unix, da die meisten Kernbefehle wirklich orthogonal sind. In Unix dugibt es die Verzeichnisgröße an, aber alles, was es tut, ist, den Baum zu durchlaufen und zusammenzufassen. Etwas, das sich in einer Pipeline wie hier sehr elegant ausdrücken lässt :-). Daher suche ich für PowerShell normalerweise nach Möglichkeiten, wie Sie das übergeordnete Ziel in geeignete Operationen auf niedrigerer Ebene zerlegen können.
Joey

3
Ich sehe, es scheint versteckte Ordner auf diese Weise zu ignorieren. ls -force -r funktioniert, wenn ich auch versteckte Ordner einschließen möchte.
Garg

2
folder\*funktioniert bei mir nicht Die Größe des Ordners, den ich an der Stelle abgelegt habe, zeigt 0 Bytes. Gibt es eine Lösung?
IT-Forscher

2
Eine etwas besser aussehende Version: Powershell -Noprofile -Befehl "'{0: N0}' -f (ls -r | Measure -s Länge) .Sum"
zumalifeguard

119

Dafür gibt es ein integriertes Windows-Tool :

dir /s 'FolderName'

Dadurch werden viele unnötige Informationen gedruckt, aber das Ende ist die Ordnergröße wie folgt:

 Total Files Listed:
       12468 File(s)    182,236,556 bytes

Wenn Sie versteckte Ordner einschließen müssen, fügen Sie hinzu /a.


7
Dies ist die eleganteste Lösung, wenn Sie keinen ganzzahligen Rückgabewert benötigen. Hinweis: Der Schalter '/ a' enthält versteckte Dateien und Systemdateien in der Gesamtgröße.
Oran D. Lord

1
Ich denke, es ist nicht möglich, Dateigrößen in nützlicheren Einheiten wie kB oder MB zu drucken, oder?
David Ferenczy Rogožan

Doppelte Anführungszeichen statt einfacher Anführungszeichen.
user2924019

66

Ich empfehle, das Dienstprogramm DU von der von Microsoft bereitgestellten Sysinternals Suite unter diesem Link http://technet.microsoft.com/en-us/sysinternals/bb896651 herunterzuladen

usage: du [-c] [-l <levels> | -n | -v] [-u] [-q] <directory>
   -c     Print output as CSV.
   -l     Specify subdirectory depth of information (default is all levels).
   -n     Do not recurse.
   -q     Quiet (no banner).
   -u     Count each instance of a hardlinked file.
   -v     Show size (in KB) of intermediate directories.


C:\SysInternals>du -n d:\temp

Du v1.4 - report directory disk usage
Copyright (C) 2005-2011 Mark Russinovich
Sysinternals - www.sysinternals.com

Files:        26
Directories:  14
Size:         28.873.005 bytes
Size on disk: 29.024.256 bytes

Werfen Sie einen Blick auf die anderen Dienstprogramme, während Sie gerade dabei sind. Sie sind ein Lebensretter für jeden Windows Professional


11
Das ist wohl kaum "ohne Tool von Drittanbietern".
Joey

11
Oh, richtig, aber es dachte, dass Familie nicht als "Dritte" betrachtet werden sollte.
Steve

1
Zugegeben, aber es ist immer noch ein zusätzlicher Download (oder die Verwendung, \\live.sysinternals.comfalls dies noch vorhanden ist). Ich stimme jedoch voll und ganz zu, dass alle sysinternalen Tools standardmäßig enthalten sein sollten. Obwohl PowerShell für viele Zwecke ein durchaus würdiger Ersatz ist.
Joey

1
Hat jemand Powershell gesagt? Versuchen Sie Folgendes: "{0: N2}" -f ((Get-ChildItem C: \ Temp -Recurse | Measure-Object -Property Length -Sum) .Sum / 1MB) + "MB"
John Homer

3
Ich schlage Ihnen allen vor, alles herunterzuladen, was Mark Russinovich entwickelt :) Ich sehe diesen Namen immer dann, wenn ich ein Werkzeug finde, das mein Leben rettet.
dkellner

45

Einzeiler:

powershell -command "$fso = new-object -com Scripting.FileSystemObject; gci -Directory | select @{l='Size'; e={$fso.GetFolder($_.FullName).Size}},FullName | sort Size -Descending | ft @{l='Size [MB]'; e={'{0:N2}    ' -f ($_.Size / 1MB)}},FullName"

Gleich, aber nur Powershell:

$fso = new-object -com Scripting.FileSystemObject
gci -Directory `
  | select @{l='Size'; e={$fso.GetFolder($_.FullName).Size}},FullName `
  | sort Size -Descending `
  | ft @{l='Size [MB]'; e={'{0:N2}    ' -f ($_.Size / 1MB)}},FullName

Dies sollte zu folgendem Ergebnis führen:

Size [MB]  FullName
---------  --------
580,08     C:\my\Tools\mongo
434,65     C:\my\Tools\Cmder
421,64     C:\my\Tools\mingw64
247,10     C:\my\Tools\dotnet-rc4
218,12     C:\my\Tools\ResharperCLT
200,44     C:\my\Tools\git
156,07     C:\my\Tools\dotnet
140,67     C:\my\Tools\vscode
97,33      C:\my\Tools\apache-jmeter-3.1
54,39      C:\my\Tools\mongoadmin
47,89      C:\my\Tools\Python27
35,22      C:\my\Tools\robomongo

1
Gibt es eine Möglichkeit, alle Dateien und Größen in MB auch im Basisordner anzuzeigen? In diesem Fall `C: \ my \ Tools`
Raunak Thomas

2
Außerdem bricht es, wenn es viele Ordner gibt (zum Beispiel im Laufwerk C
:)

0.00 C:\Windowskann ich dies für alle Ordner optimieren, versucht bereits als Admin ausgeführt
Tilo

Das ist gut, aber es schneidet meine Komponentenordnernamen ab. Was ist der Befehl, um sie vollständig anzuzeigen?
Sean.net

@ sean.net meinst du, es endet bei langen Ordnern mit "..."? So funktioniert ft( Format-Table). Sie können flstattdessen versuchen ( Format-List)
frizik

16

Wenn Sie Git auf Ihrem Computer installiert haben (was immer häufiger vorkommt), öffnen Sie einfach MINGW32 und geben Sie Folgendes ein: du folder


4
Sie können den folgenden Befehl verwenden, du -h -d 1 folder | sort -hwenn Sie eine lesbare Größe, nur eine Ebene von Unterverzeichnissen und eine Sortierung nach Größe wünschen.
Vard

8

Ich empfehle die Verwendung des Dienstprogramms https://github.com/aleksaan/diskusage . Sehr einfach und hilfreich. Und sehr schnell.

Geben Sie einfach eine Befehlsshell ein

diskusage.exe -path 'd:/go; d:/Books'

und erhalten Sie eine Liste der Ordner nach Größe sortiert

  1. | DIR: d: / go | GRÖSSE: 325,72 Mb | TIEFE: 1
  2. | DIR: d: / Bücher | GRÖSSE: 14,01 Mb | TIEFE: 1

Dieses Beispiel wurde mit 272 ms auf der Festplatte ausgeführt.

Sie können die Tiefe der zu analysierenden Unterordner erhöhen, zum Beispiel:

diskusage.exe -path 'd:/go; d:/Books' -depth 2

und erhalten Sie Größen nicht nur für ausgewählte Ordner, sondern auch für die Unterordner

  1. | DIR: d: / go | GRÖSSE: 325,72 Mb | TIEFE: 1
  2. | DIR: d: / go / pkg | GRÖSSE: 212,88 Mb | TIEFE: 2
  3. | DIR: d: / go / src | GRÖSSE: 62,57 Mb | TIEFE: 2
  4. | DIR: d: / go / bin | GRÖSSE: 30,44 Mb | TIEFE: 2
  5. | DIR: d: / Bücher / Schach | GRÖSSE: 14,01 Mb | TIEFE: 2
  6. | DIR: d: / Bücher | GRÖSSE: 14,01 Mb | TIEFE: 1
  7. | DIR: d: / go / api | GRÖSSE: 6,41 Mb | TIEFE: 2
  8. | DIR: d: / go / test | GRÖSSE: 5,11 Mb | TIEFE: 2
  9. | DIR: d: / go / doc | GRÖSSE: 4,00 Mb | TIEFE: 2
 10. | DIR: d: / go / misc | GRÖSSE: 3,82 Mb | TIEFE: 2
 11. | DIR: d: / go / lib | GRÖSSE: 358,25 Kb | TIEFE: 2

* 3,5 TB auf dem Server wurden für 3 Minuten und 12 Minuten gescannt


Neue Version veröffentlicht! github.com/aleksaan/diskusage Verbesserungen: 1) korrekte Arbeit mit Symlink-Größen 2) oder alle Informationen über analysierte Objekte
Alexander Anufriev

Version 2.0.2 veröffentlicht! github.com/aleksaan/diskusage/releases/tag/v2.0.2 - Konfigurationsdatei statt Inline-Parameter - Einfacher Verwendungsmodus (ausführbare Diskusage in einen beliebigen Ordner kopieren, ausführen und Ergebnisse abrufen) - Richtige Ergebnisausgabe (korrekter Gewinn am Ende des Zeilensymbols) / unix) - Ergebnisse in Datei speichern oder im Konsolenmodus abrufen (Option 'tofile')
Alexander Anufriev

Bitte beachten Sie, dass Sie ein Autor sind. (Von stackoverflow.com/help/promotion : "Sie müssen jedoch Ihre Zugehörigkeit in Ihren Antworten offenlegen." )
Aeracode

6

Hier kommt ein Powershell-Code, den ich in Listengröße und Dateizahl für alle Ordner im aktuellen Verzeichnis schreibe. Sie können es nach Bedarf wiederverwenden oder ändern.

$FolderList = Get-ChildItem -Directory
foreach ($folder in $FolderList)
{
    set-location $folder.FullName
    $size = Get-ChildItem -Recurse | Measure-Object -Sum Length
    $info = $folder.FullName + "    FileCount: " + $size.Count.ToString() + "   Size: " + [math]::Round(($size.Sum / 1GB),4).ToString() + " GB"
    write-host $info
}

Funktioniert bei mir. Nützlich, wenn Sie sich auf einem kopflosen Server befinden.
Andrew Pate

Einfach und elegant! Meine Version: $FolderList = Get-ChildItem -Directory -Force; $data = foreach ($folder in $FolderList) { set-location $folder.FullName; $size = Get-ChildItem -Recurse -Force | Measure-Object -Sum Length; $size | select @{n="Path"; e={$folder.Fullname}}, @{n="FileCount"; e={$_.count}}, @{n="Size"; e={$_.Sum}} } Dies liefert Objekte (mehr Powershell-ish), 'FileCount' und 'Size' sind Ganzzahlen (damit Sie sie später bei Bedarf verarbeiten können) und 'Size' in Bytes, aber Sie können sie leicht in konvertieren GB (oder das gewünschte Gerät) mit $Data.Size / 1GB.
Curropar

Oder ein $Data = dir -Directory -Force | %{ $CurrentPath = $_.FullName; Get-ChildItem $CurrentPath -Recurse -Force -ErrorAction SilentlyContinue | Measure-Object -Sum Length | select @{n="Path"; e={$CurrentPath}}, @{n="FileCount"; e={$_.count}}, @{n="Size"; e={$_.Sum}} }
Einzeiler

2

Dieser Code wird getestet. Sie können es erneut überprüfen.

@ECHO OFF
CLS
SETLOCAL
::Get a number of lines contain "File(s)" to a mytmp file in TEMP location.
DIR /S /-C | FIND "bytes" | FIND /V "free" | FIND /C "File(s)" >%TEMP%\mytmp
SET /P nline=<%TEMP%\mytmp
SET nline=[%nline%]
::-------------------------------------
DIR /S /-C | FIND "bytes" | FIND /V "free" | FIND /N "File(s)" | FIND "%nline%" >%TEMP%\mytmp1
SET /P mainline=<%TEMP%\mytmp1
CALL SET size=%mainline:~29,15%
ECHO %size%
ENDLOCAL
PAUSE

Danke, es funktioniert für mich mit Ordnern, die kleiner als 1 GB sind, aber ich habe zum Beispiel einen Ordner mit 3.976.317.115 Bytes (3.70 GB), und das Skript gibt mir diese Zeichenfolge ") 932" zurück. Wissen Sie warum?
Elady

2

Ich denke, dies würde nur funktionieren, wenn das Verzeichnis ziemlich statisch ist und sich sein Inhalt zwischen der Ausführung der beiden dir-Befehle nicht ändert. Vielleicht eine Möglichkeit, dies in einem Befehl zu kombinieren, um dies zu vermeiden, aber dies funktionierte für meinen Zweck (ich wollte nicht die vollständige Auflistung; nur die Zusammenfassung).

GetDirSummary.bat Skript:

@echo off
rem  get total number of lines from dir output
FOR /F "delims=" %%i IN ('dir /S %1 ^| find "asdfasdfasdf" /C /V') DO set lineCount=%%i
rem  dir summary is always last 3 lines; calculate starting line of summary info
set /a summaryStart="lineCount-3"
rem  now output just the last 3 lines
dir /S %1 | more +%summaryStart%

Verwendung:

GetDirSummary.bat c: \ temp

Ausgabe:

 Total Files Listed:
          22 File(s)         63,600 bytes
           8 Dir(s)  104,350,330,880 bytes free

1

Ich habe du.exemit meiner Git-Distribution bekommen. Ein anderer Ort könnte Microsoft oder Unxutils sein .

Sobald du du.exe auf deinem Weg hast. Hier ist dein fileSizes.bat:-)

@echo ___________
@echo DIRECTORIES
@for /D %%i in (*) do @CALL du.exe -hs "%%i"
@echo _____
@echo FILES
@for %%i in (*) do @CALL du.exe -hs "%%i"
@echo _____
@echo TOTAL
@du.exe -sh "%CD%"

___________
DIRECTORIES
37M     Alps-images
12M     testfolder
_____
FILES
765K    Dobbiaco.jpg
1.0K    testfile.txt
_____
TOTAL
58M    D:\pictures\sample

1

Ich denke, Ihre einzige Option ist diruse (eine stark unterstützte Lösung von Drittanbietern):

Ruft die Datei- / Verzeichnisgröße über die Befehlszeile ab

Die Windows-CLI ist leider recht restriktiv. Sie können auch Cygwin installieren, was im Vergleich zu cmd ein Traum ist. Dadurch erhalten Sie Zugriff auf das portierte Unix-Tool du, das die Grundlage für Diruse unter Windows bildet.

Entschuldigung, ich konnte Ihre Fragen nicht direkt mit einem Befehl beantworten, den Sie auf dem nativen CLI ausführen können.


1
Wenn Sie nur brauchen, dudann ist Cygwin viel übertrieben. Gehen Sie einfach mit GnuWin32 .
Joey

2
Es ist zwar übertrieben, aber es ist auch großartig. +1 für Ihren Beitrag über @joey (habe nicht den Repräsentanten, der es wörtlich macht :()
Illizian

Meiner bescheidenen Meinung nach mag Cygwin für manche nützlich sein, aber es ist alles andere als großartig und ziemlich schrecklich. Aber ich denke, Unix-Benutzer sagen dasselbe über Wine.
Joey

1
"Wein" - Schauder, ich verwende Cygwin auf meinem Entwicklungs-Laptop, weil die Akkulaufzeit unter Linux erschreckend ist und es nicht bequem ist, eine VM darauf auszuführen. Es braucht einige Einstellungen, aber Cygwin ist brillant für diejenigen unter uns, die die Nix-Shell in Windows vermissen. Ich persönlich mag Powershell nicht. Möglicherweise muss ich GnuWin ausprobieren. Danke @Joey.
Illizian

1

:: Holen Sie sich eine Anzahl von Zeilen, die Dir-Befehle zurückgeben (/ -c, um Zahlentrennzeichen zu entfernen:.,) ["Tokens = 3", um nur die dritte Spalte jeder Zeile in Dir zu betrachten]

FOR /F "tokens=3" %%a IN ('dir /-c "%folderpath%"') DO set /a i=!i!+1

Nummer der vorletzten Zeile, wobei die Anzahl der Bytes der Summe der Dateien ist:

set /a line=%i%-1

Holen Sie sich schließlich die Anzahl der Bytes in der vorletzten Zeile - 3. Spalte:

set i=0
FOR /F "tokens=3" %%a IN ('dir /-c "%folderpath%"') DO (
  set /a i=!i!+1
  set bytes=%%a
  If !i!==%line% goto :size  
)
:size
echo %bytes%

Da die Wortsuche nicht verwendet wird, treten keine Sprachprobleme auf.

Einschränkungen:

  • Funktioniert nur mit Ordnern mit weniger als 2 GB (cmd verarbeitet keine Zahlen mit mehr als 32 Bit)
  • Liest nicht die Anzahl der Bytes der internen Ordner.

1

Versuchen:

SET FOLDERSIZE=0
FOR /F "tokens=3" %A IN ('DIR "C:\Program Files" /a /-c /s ^| FINDSTR /C:" bytes" ^| FINDSTR /V /C:" bytes free"') DO SET FOLDERSIZE=%A

Ändern Sie C: \ Programme in einen beliebigen Ordner und ändern Sie% A in %% A, wenn Sie es in einer Batchdatei verwenden

Es gibt die Größe des gesamten Ordners zurück, einschließlich Unterordner sowie versteckter Dateien und Systemdateien, und funktioniert mit Ordnern über 2 GB

Es wird auf den Bildschirm geschrieben, daher müssen Sie eine Zwischendatei verwenden, wenn Sie das nicht möchten.


1

Das folgende Skript kann verwendet werden, um die Größe jeder Datei in einem bestimmten Ordner abzurufen und zu akkumulieren.
Der Ordnerpfad %folder%kann als Argument für dieses Skript angegeben werden ( %1).
Letztendlich werden die Ergebnisse im Parameter gehalten%filesize%

@echo off
SET count=1
SET foldersize=0
FOR /f "tokens=*" %%F IN ('dir /s/b %folder%') DO (call :calcAccSize "%%F")
echo %filesize%
GOTO :eof

:calcAccSize
 REM echo %count%:%1
 REM set /a count+=1
 set /a foldersize+=%~z1
 GOTO :eof

Hinweis: Die Methode calcAccSizekann auch den Inhalt des Ordners drucken (im obigen Beispiel kommentiert).


1

Hier finden Sie eine Lösung für beide Anforderungen in der Art und Weise, wie Sie sie ursprünglich angefordert haben. Es gibt die Dateigröße für die menschliche Lesbarkeit ohne die Einschränkungen der Dateigröße, die jeder erfährt. Kompatibel mit Win Vista oder neuer. XP nur verfügbar, wenn Robocopy installiert ist. Legen Sie einfach einen Ordner in dieser Batch-Datei ab oder verwenden Sie die unten beschriebene bessere Methode.

@echo off
setlocal enabledelayedexpansion
set "vSearch=Files :"

For %%i in (%*) do (
    set "vSearch=Files :"
    For /l %%M in (1,1,2) do ( 
        for /f "usebackq tokens=3,4 delims= " %%A in (`Robocopy "%%i" "%%i" /E /L /NP /NDL /NFL ^| find "!vSearch!"`) do (
            if /i "%%M"=="1" (
                set "filecount=%%A"
                set "vSearch=Bytes :"
            ) else (
                set "foldersize=%%A%%B"
            )
        )
    )
    echo Folder: %%~nxi FileCount: !filecount! Foldersize: !foldersize!
    REM remove the word "REM" from line below to output to txt file
    REM echo Folder: %%~nxi FileCount: !filecount! Foldersize: !foldersize!>>Folder_FileCountandSize.txt
)
pause

Um diese Batch-Datei bequem verwenden zu können, legen Sie sie bequem in Ihrem SendTo-Ordner ab. Auf diese Weise können Sie mit der rechten Maustaste auf einen Ordner oder eine Auswahl von Ordnern klicken, auf die Option SendTo klicken und dann diese Batchdatei auswählen.

Um den SendTo-Ordner auf Ihrem Computer zu finden, öffnen Sie am einfachsten cmd und kopieren Sie es unverändert in diese Zeile.

explorer C:\Users\%username%\AppData\Roaming\Microsoft\Windows\SendTo


Für alle, die besorgt sind, wird Robocopy Dateien verschieben. Die Option / l listet nur auf. Darüber hinaus ist Robocopy kein Drittanbieter. Robocopy wird standardmäßig in Windows ab Vista installiert, XP müssen Sie installieren.
Julesverne

Danke für den Zusatz. Ich bin froh zu sehen, dass dieser Thread immer noch Aufmerksamkeit erregt ;-) Vielleicht möchte ich hinzufügen, wie man Robocopy installiert (tolles Tool!).
Eldad Assis

0

Ich habe ein ähnliches Problem gelöst. Einige der Methoden auf dieser Seite sind langsam und andere in mehrsprachigen Umgebungen problematisch (alle nehmen Englisch an). Ich habe eine einfache Problemumgehung mit vbscript in cmd gefunden. Es ist in W2012R2 und W7 getestet.

>%TEMP%\_SFSTMP$.VBS ECHO/Set objFSO = CreateObject("Scripting.FileSystemObject"):Set objFolder = objFSO.GetFolder(%1):WScript.Echo objFolder.Size
FOR /F %%? IN ('CSCRIPT //NOLOGO %TEMP%\_SFSTMP$.VBS') DO (SET "S_=%%?"&&(DEL %TEMP%\_SFSTMP$.VBS))

Es setzt die Umgebungsvariable S_. Sie können natürlich die letzte Zeile ändern, um das Ergebnis direkt auf z

FOR /F %%? IN ('CSCRIPT //NOLOGO %TEMP%\_SFSTMP$.VBS') DO (ECHO "Size of %1 is %%?"&&(DEL %TEMP%\_SFSTMP$.VBS))

Sie können es als Unterprogramm oder als eigenständiges cmd verwenden. Parameter ist der Name des getesteten Ordners, der in Anführungszeichen geschlossen wird.


-3

Die einfachste Methode, um nur die Gesamtgröße zu erhalten, ist Powershell, ist jedoch durch die Tatsache begrenzt, dass Pfadnamen, die länger als 260 Zeichen sind, nicht in der Gesamtgröße enthalten sind


2
Dies ist eine schlechte und schlechte Antwort. Was ist die Befehlszeile oder der Code?
Tatarin
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.