2012-10-10 29 views

Respuesta

72

Usted puede añadir hasta tamaños de forma recursiva (el siguiente es un archivo por lotes):

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

Sin embargo, esto tiene varios problemas porque cmd está limitado a 32 bits aritmética de enteros con signo. Por lo tanto, obtendrá tamaños superiores a 2 GiB incorrectos . Además, probablemente contará enlaces simbólicos y cruces múltiples veces, por lo que es, en el mejor de los casos, un límite superior, no el tamaño real (sin embargo, tendrás ese problema con cualquier herramienta).

Una alternativa es PowerShell:

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

o más corto:

ls -r | measure -s Length 

si lo quieres más bonita:

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

Se puede utilizar esta directamente desde cmd:

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

tengo una biblioteca bignum parcialmente terminada en archivos por lotes en algún lugar, que al menos obtiene además de enteros de precisión arbitraria derecha. Realmente debería liberarlo, supongo :-)

+0

+1 Estaba vagando en el Get-Help * La salida de encontrar algo por el estilo. – Steve

+1

Steve, en mi opinión, PowerShell es mucho más Unix-y que Unix en que la mayoría de los comandos básicos son realmente ortogonales. En Unix, 'du' proporciona el tamaño del directorio, pero lo único que hace es recorrer el árbol y resumir. Algo que se puede expresar muy elegantemente en una tubería como aquí :-). Entonces, para PowerShell generalmente busco cómo descomponer la meta de alto nivel en operaciones adecuadas de nivel inferior. – Joey

+0

Parece que no devuelve el resultado actual para el directorio de inicio de un usuario. En un caso, si hago clic derecho en una carpeta de inicio y obtengo propiedades, veo ~ 200 MB. Si hago ls -r

| medida -s longitud luego veo 6 megas (en bytes) – garg

52

Sugiero descargar la utilidad DU de la Suite Sysinternals proporcionada por Microsoft en este enlace 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 

Mientras que usted está en él, echar un vistazo a las otras utilidades Ellos son un salvavidas para todos los Windows Professional

+9

Eso es difícil "sin ninguna herramienta de terceros", supongo. – Joey

+7

Oh, sí, pero pensó que la familia no debería considerarse 'de terceros'. – Steve

+1

Bien, concedido, pero sigue siendo una descarga adicional (o usando '\\ live.sysinternals.com' si eso todavía existe). Sin embargo, estoy totalmente de acuerdo en que todas las herramientas sysinternals deben incluirse por defecto. Aunque para muchos usos PowerShell es un reemplazo bastante digno. – Joey

1

Creo que su única opción será Diruse (una solución de 3 ª parte muy apoyado):

Get file/directory size from command line

La CLI de Windows es desafortunadamente, bastante restrictiva, usted podría alternativamente instale Cygwin que es un sueño para usar en comparación con cmd. Eso le daría acceso a la herramienta portada de Unix du, que es la base de diruse en Windows.

Lo siento, no he podido responder a sus preguntas directamente con un comando que puede ejecutar en el cli nativo.

+1

Si solo necesitas 'du' entonces Cygwin es demasiado exagerado. Simplemente vaya con [GnuWin32] (http://gnuwin32.sourceforge.net/). – Joey

+2

De hecho es excesivo, pero también es increíble. +1 para su publicación de arriba @joey (no tengo el representante para hacerlo literalmente :() – Illizian

+0

En mi humilde opinión, Cygwin puede ser útil para algunos, pero está lejos de ser impresionante y bastante horrible. Pero supongo que los usuarios de Unix dicen lo mismo sobre Wine. – Joey

2

Este código está probado. Puedes verificarlo de nuevo.

@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

Gracias, me funciona con carpetas de menos de 1GB, pero por ejemplo, tengo una carpeta de 3,976,317,115 bytes (3,70 GB), y el script me devuelve esta cadena ") 932", ¿sabes por qué? – elady

6

Si ha instalado git en su ordenador (cada vez más y más común) acaba de abrir mingw32 y tipo: du folder

-2

método más fácil para obtener el tamaño total es de PowerShell, pero aún está limitado por hecho que las rutas de más de 260 caracteres no están incluidos en el total

+1

Esta es una respuesta mala y pobre. ¿Cuál es la línea de comando o código? – Tatarin

1

llegué con mi du.exe distribución git. Otro lugar podría ser el mencionado Microsoft o Unxutils.

Una vez que tienes du.exe en tu camino. Aquí tiene su 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

He resuelto un problema similar. Algunos de los métodos en esta página son lentos y algunos son problemáticos en entornos multilenguaje (todos suponen inglés). Encontré una solución simple usando vbscript en cmd. Se prueba en W2012R2 y 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)) 

Establece la variable de entorno S_. Por supuesto, puede cambiar la última línea para mostrar directamente el resultado, p.

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

Puede usarlo como subrutina o como stand-alone cmd. El parámetro es el nombre de la carpeta probada, cerrada entre comillas.

55

Hay una herramienta integrada de Windows para ello:

dir /s 'FolderName' 

Esto imprime una gran cantidad de información innecesaria, pero al final será el tamaño de la carpeta de esta manera:

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

Si necesita incluir carpetas ocultas, agregue /a.

+4

Esta es la solución más elegante si no requiere un valor de retorno entero. Nota: el interruptor '/ a' incluirá archivos ocultos y del sistema en el tamaño total. –

+7

Esta debería ser la respuesta aceptada. –

0

:: Obtener un número de líneas que Dir comandos de retornos (/ -c para eliminar separadores número:.,) [ "Tokens = 3" para mirar sólo a la tercera columna de cada línea en Dir]

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

número de la penúltima línea, donde es el número de bytes de la suma de los archivos:

set /a line=%i%-1 

, finalmente, obtener el número de bytes en la penúltima línea - tercera columna:

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% 

Como no utiliza búsqueda de palabras que no habría problemas de idioma.

Limitaciones:

  • sólo funciona con carpetas de menos de 2 GB (cmd no maneja los números de más de 32 bits)
  • no lee el número de bytes de las carpetas internas.
1

Probar:

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 

Cambio C: \ Archivos de programa a cualquier carpeta que desee y cambie% de A a A %% si se utiliza en un archivo por lotes

Devuelve el tamaño de la toda la carpeta, incluidas las subcarpetas y los archivos ocultos y del sistema, y ​​funciona con carpetas de más de 2 GB

Escribe en la pantalla, por lo que tendrá que usar un archivo provisional si no lo desea.

2

Supongo que esto solo funcionaría si el directorio es bastante estático y sus contenidos no cambian entre la ejecución de los dos comandos dir. Tal vez una forma de combinar esto en un solo comando para evitar eso, pero esto funcionó para mi propósito (no quería el listado completo, solo el resumen).

GetDirSummary.bat Guión:

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

Uso:

GetDirSummary.bat c: \ temp

Salida:

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" 

mismo pero sólo 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 

Esto debería producir el siguiente resultado:

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 
Cuestiones relacionadas