it-swarm.com.de

Holen Sie sich die Ordnergröße über die Windows-Befehlszeile

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

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

98
Eldad AK

Sie können die Größen einfach rekursiv addieren (das Folgende ist eine Batchdatei):

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

Dies hat jedoch mehrere Probleme, da cmd auf 32-Bit-Ganzzahlarithmetik mit Vorzeichen beschränkt ist. Es werden also Größen über 2 GiB falsch angezeigt1. Außerdem werden Symlinks und Verknüpfungen wahrscheinlich mehrmals gezählt. Es handelt sich also bestenfalls um eine obere Schranke und nicht um die tatsächliche Größe (Sie haben jedoch bei jedem Werkzeug das Problem).

Eine Alternative ist PowerShell:

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

oder kürzer:

ls -r | measure -s Length

Wenn Sie es schöner haben wollen:

switch((ls -r|measure -s 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 aus cmd verwenden:

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

1 Ich habe irgendwo eine teilweise fertige Bignum-Bibliothek in Batch-Dateien, die zumindest die Integer-Addition mit beliebiger Genauigkeit erhält. Ich sollte es wirklich veröffentlichen, denke ich :-)

93
Joey

Es gibt ein eingebautes Windows-Tool dafür:

dir /s 'FolderName'

Dadurch werden viele unnötige Informationen gedruckt, das Ende wird jedoch die Ordnergröße wie folgt sein:

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

Wenn Sie versteckte Ordner hinzufügen möchten, fügen Sie /a hinzu.

89
Andro Secy

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

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

Schauen Sie sich die anderen Dienstprogramme an, wenn Sie gerade dabei sind. Sie sind ein Lebensretter für jedes Windows Professional

59
Steve

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"

Gleiche 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
21
frizik

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

9
Custodio

Ich empfehle die Verwendung von https://github.com/aleksaan/diskusage utility. Sehr einfach und hilfsbereit Und sehr schnell.

Geben Sie einfach eine Befehls-Shell ein

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

und 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 um 272ms 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 ihre 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.5Tb auf dem Server wurde nach 3m12s gescannt

6

Hier kommt ein Powershell-Code, den ich schreibe, um die Listengröße und die Anzahl der Dateien für alle Ordner im aktuellen Verzeichnis anzugeben. Fühlen Sie sich frei, sie je nach Bedarf wiederzuverwenden oder zu ä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
}
3
Ryan Lee

Ich denke, das würde nur funktionieren, wenn das Verzeichnis ziemlich statisch ist und sich der Inhalt zwischen den beiden dir-Befehlen 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%

Verwendungszweck:

GetDirSummary.bat c:\temp

Ausgabe:

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

Dieser Code wird getestet. Sie können es noch einmal ü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
2
Chienvela

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 %filesize% gespeichert

@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 calcAccSize kann auch den Inhalt des Ordners drucken (im obigen Beispiel kommentiert).

1
Lior Kirshner

Ich habe du.exe mit meiner Git-Distribution erhalten. Ein anderer Ort könnte Microsoft oder Unxutils sein.

Sobald du du.exe in deinem Pfad 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
Frank Nocke

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 den gewünschten 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 Unterordnern sowie versteckter Dateien und Systemdateien, und arbeitet mit Ordnern über 2 GB

Es schreibt jedoch auf den Bildschirm, daher müssen Sie eine Zwischendatei verwenden, wenn Sie dies nicht möchten.

1
FrinkTheBrave

Hier finden Sie also eine Lösung für beide Anfragen in der Art und Weise, wie Sie ursprünglich gefragt haben. Es gibt der menschlichen Lesbarkeit Dateigröße ohne die Dateigrößenbeschränkungen, die jeder erlebt. 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!>>FolderFileCountandSize.txt
    REM remove REM from command 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 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 Senden an klicken und dann diese Batchdatei auswählen.

Um den SendTo-Ordner auf Ihrem Computer zu finden, öffnen Sie am einfachsten cmd und kopieren Sie ihn so wie er ist in diese Zeile.

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

1
julesverne

Ich glaube, Ihre einzige Option ist Diruse (eine stark unterstützte Drittanbieterlösung):

Abrufen der Datei Verzeichnisgröße über die Befehlszeile - /

Die Windows-CLI ist leider ziemlich restriktiv. Sie können alternativ Cygwin installieren, was im Vergleich zu cmd ein Traum ist. Das würde Ihnen Zugriff auf das portierte Unix-Tool du geben, das die Basis für Diruse unter Windows darstellt.

Entschuldigung, ich konnte Ihre Fragen nicht direkt mit einem Befehl beantworten, den Sie für das native CLI ausführen können.

1
Illizian

Ich habe ein ähnliches Problem gelöst. Einige der Methoden auf dieser Seite sind langsam und andere sind in mehrsprachigen Umgebungen problematisch (alle setzen Englisch voraus). Ich fand eine einfache Problemumgehung, die Vbscript in cmd verwendet. Es wurde 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 Umgebungsvariable S_. Sie können natürlich die letzte Zeile ändern, um das Ergebnis direkt anzuzeigen, 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 in Anführungszeichen.

0
arpi

:: Holen Sie sich eine Anzahl von Zeilen, die Dir zurückgibt (/ -c, um Nummerntrennzeichen 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

Schließlich erhalten Sie 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 Word Search nicht verwendet wird, treten keine Sprachprobleme auf.

Einschränkungen:

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