2012-10-10 23 views

risposta

72

Si può solo aggiungere fino dimensioni in modo ricorsivo (Il seguente è un file batch):

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

Tuttavia, questo ha diversi problemi a causa cmd è limitata a numero intero con segno aritmetico a 32 bit. Quindi otterrà dimensioni superiori a 2 GiB errate . Inoltre conterrà probabilmente più collegamenti simbolici e giunzioni più volte, quindi è al massimo un limite superiore, non la dimensione reale (tuttavia si avrà il problema con qualsiasi strumento).

Un'alternativa è PowerShell:

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

o più corto:

ls -r | measure -s Length 

se lo vuoi più bella:

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" } 
} 

È possibile utilizzare questo direttamente da cmd:

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

Io ho una libreria bignum parzialmente rifinito in file batch da qualche parte almeno, viene aggiunta interi precisione arbitraria destra. Dovrei davvero rilasciarlo, immagino :-)

+0

+1 Stavo vagando nel get-help * Uscita di trovare qualcosa di simile. – Steve

+1

Steve, ai miei occhi PowerShell è molto più Unix-y di Unix in quanto i comandi principali sono in realtà ortogonali. In Unix 'du' fornisce la dimensione della directory, ma tutto ciò che sta facendo è camminare sull'albero e riassumere. Qualcosa che può essere espresso molto elegantemente in una pipeline come qui :-). Quindi per PowerShell di solito cerco come si può scomporre l'obiettivo di alto livello in opportune operazioni di livello inferiore. – Joey

+0

Sembra non restituire il risultato corrente per la home directory di un utente. In un caso, se faccio clic destro su una cartella principale e ottengo proprietà, vedo ~ 200 MB. Se faccio ls -r

| misura-lunghezza quindi vedo 6 mega (in byte) – garg

52

suggerisco di scaricare utility DU dal Sysinternals Suite fornita da Microsoft a questo link 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 

Mentre si è in esso, dare un'occhiata a le altre utilità. Si tratta di un salvavita per ogni Windows Professional

+9

Questo non è "senza nessuno strumento di terze parti", immagino. – Joey

+7

Oh, giusto, ma pensava che la famiglia non dovesse essere considerata "di terze parti". – Steve

+1

Bene, concesso, ma è ancora un download aggiuntivo (o usando '\\ live.sysinternals.com' se esiste ancora). Sono assolutamente d'accordo, tuttavia, che tutti gli strumenti di sysinternals dovrebbero essere inclusi di default. Anche se per molti usi PowerShell è una sostituzione abbastanza degna. – Joey

1

Credo che l'unica opzione sarà Diruse (una soluzione di terze parti altamente supportato):

Get file/directory size from command line

Windows CLI è unfortuntely alquanto restrittiva, si potrebbe in alternativa installa Cygwin che è un sogno da usare rispetto a cmd. Questo ti darebbe accesso allo strumento Unix portato che è la base della dirussione su Windows.

Mi spiace di non essere stato in grado di rispondere alle tue domande direttamente con un comando che puoi eseguire sul cli nativo.

+1

Se hai solo bisogno di 'du', Cygwin è decisamente eccessivo. Basta andare con [GnuWin32] (http://gnuwin32.sourceforge.net/). – Joey

+2

In effetti è eccessivo, ma è anche fantastico. +1 per il tuo post sopra @joey (non ho il rep per farlo letteralmente :() – Illizian

+0

A mio modesto parere Cygwin può essere utile per alcuni, ma è tutt'altro che fantastico e piuttosto orribile.Ma suppongo che gli utenti Unix dicono lo stesso riguardo Wine. – Joey

2

Questo codice è testato. Puoi controllarlo di nuovo.

@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 
+0

Grazie, funziona per me con le cartelle più piccole di 1 GB, ma per esempio, ho una cartella di 3.976.317.115 byte (3.70 GB), e lo script restituisce questa stringa ") 932", sai perché? – elady

6

Se avete git installato nel computer (sempre più comune) basta aprire mingw32 e digitare: du folder

-2

metodo più semplice per ottenere solo la dimensione totale è di PowerShell, ma ancora è limitata dal fatto quel percorso più lungo di 260 caratteri non è incluso nel totale

+1

Questa è una risposta cattiva e scarsa. Qual è la riga di comando o il codice? – Tatarin

1

Ho ottenuto du.exe con la mia distribuzione git. Un altro posto potrebbe essere Microsoft o Unxutils.

Una volta che hai du.exe nel tuo percorso. Ecco il tuo 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 
0

ho risolto problema simile. Alcuni dei metodi in questa pagina sono lenti e alcuni sono problematici nell'ambiente multilingua (tutti supponiamo che l'inglese). Ho trovato una soluzione semplice usando vbscript in cmd. È testato in W2012R2 e W7.

>%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)) 

Imposta la variabile di ambiente S_. Ovviamente puoi modificare l'ultima riga per visualizzare direttamente il risultato ad es.

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

È possibile utilizzarlo come subroutine o come cmd standlone. Il parametro è il nome della cartella testata chiusa tra virgolette.

55

C'è un built-in strumento di Windows per questo:

dir /s 'FolderName' 

Questo stamperà un sacco di informazioni inutili, ma alla fine sarà la dimensione della cartella in questo modo:

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

Se è necessario includere cartelle nascoste aggiungere /a.

+4

Questa è la soluzione più elegante se non si richiede un valore di ritorno intero. Nota: l'opzione '/ a' includerà i file nascosti e di sistema nella dimensione totale. –

+7

Questa dovrebbe essere la risposta accettata. –

0

:: Ottenere una serie di linee che comanda Dir restituisce (/ c per eliminare i separatori numero:.,) [ "tokens = 3" per guardare solo alla terza colonna di ogni riga in Dir]

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

numero di penultima riga, dove si trova il numero di byte della somma di file:

set /a line=%i%-1 

finalmente ottenere il numero di byte nella penultima riga - 3 ° colonna:

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% 

Poiché non utilizza la ricerca di parole, non avrebbe problemi di lingua.

Limitazioni:

  • funziona solo con le cartelle inferiori a 2 GB (cmd non gestisce numero di più di 32 bit)
  • non legge il numero di byte delle cartelle interne.
1

Prova:

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 

Modifica C: \ Program Files a qualsiasi cartella che si desidera e cambiare% A %% A se si utilizza in un file batch

Esso restituisce la dimensione del intera cartella, comprese le sottocartelle e i file nascosti e di sistema, e funziona con le cartelle oltre 2 GB

Scrive sullo schermo, quindi sarà necessario utilizzare un file temporaneo se non lo si desidera.

2

Immagino che ciò funzionerebbe solo se la directory è abbastanza statica e il suo contenuto non cambia tra l'esecuzione dei due comandi dir. Forse un modo per combinare questo in un unico comando per evitarlo, ma questo ha funzionato per il mio scopo (non volevo la lista completa, ma solo il sommario).

GetDirSummary.bat Script:

@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% 

Usage:

GetDirSummary.bat c: \ temp

uscita:

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

Oneliner:

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" 

Same but PowerShell solo:

$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 

Questo dovrebbe produrre il seguente risultato:

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 
Problemi correlati