¿Es posible en Windows obtener el tamaño de una carpeta desde la línea de comandos sin usar ninguna herramienta de terceros?
Quiero el mismo resultado que obtendría al hacer clic derecho en la carpeta en el explorador de Windows → propiedades.
¿Es posible en Windows obtener el tamaño de una carpeta desde la línea de comandos sin usar ninguna herramienta de terceros?
Quiero el mismo resultado que obtendría al hacer clic derecho en la carpeta en el explorador de Windows → propiedades.
Respuestas:
Puede sumar tamaños recursivamente (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
se limita a la aritmética de enteros con signo de 32 bits. Por lo tanto, obtendrá tamaños superiores a 2 GiB incorrectos 1 . Además, es probable que cuente los enlaces simbólicos y las uniones varias veces, por lo que es, en el mejor de los casos, un límite superior, no el tamaño real (sin embargo, tendrá ese problema con cualquier herramienta).
Una alternativa es PowerShell:
Get-ChildItem -Recurse | Measure-Object -Sum Length
o más corto:
ls -r | measure -sum Length
Si lo quieres más bonito:
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" }
}
Puede usar esto directamente desde cmd
:
powershell -noprofile -command "ls -r|measure -sum Length"
1 Tengo una biblioteca bignum parcialmente terminada en archivos por lotes en algún lugar que al menos obtiene la suma de enteros de precisión arbitraria. Realmente debería lanzarlo, supongo :-)
du
da el tamaño del directorio, pero todo lo que hace es caminar por el árbol y resumir. Algo que se puede expresar de manera muy elegante en una tubería como aquí :-). Entonces, para PowerShell, generalmente busco cómo puede descomponer el objetivo de alto nivel en operaciones adecuadas de nivel inferior.
folder\*
no me funciona el tamaño de la carpeta que puse en el lugar muestra 0 bytes, ¿hay alguna solución?
Hay una herramienta de Windows incorporada para eso:
dir /s 'FolderName'
Esto imprimirá mucha 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
.
Sugiero descargar la utilidad DU del Sysinternals Suite provisto 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 lo hace, eche un vistazo a las otras utilidades. Son un salvavidas para todos los Windows Professional
\\live.sysinternals.com
si todavía existe). Sin embargo, estoy totalmente de acuerdo en que todas las herramientas de sysinternals deben incluirse por defecto. Aunque para muchos usos, PowerShell es un reemplazo bastante digno.
Un trazador de líneas:
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"
Lo mismo pero solo 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
0.00 C:\Windows
¿Puedo optimizar esto para todas las carpetas? Intenté ejecutar como administrador
ft
( Format-Table
). Puedes probar en su fl
lugar ( Format-List
)
Recomiendo usar la utilidad https://github.com/aleksaan/diskusage . Muy simple y útil. Y muy rapido.
Simplemente escriba un shell de comando
diskusage.exe -path 'd:/go; d:/Books'
y obtener una lista de carpetas ordenadas por tamaño
1. | DIR: d: / ir | TAMAÑO: 325.72 Mb | PROFUNDIDAD: 1 2. | DIR: d: / Libros | TAMAÑO: 14.01 Mb | PROFUNDIDAD: 1
Este ejemplo se ejecutó a 272 ms en HDD.
Puede aumentar la profundidad de las subcarpetas para analizar, por ejemplo:
diskusage.exe -path 'd:/go; d:/Books' -depth 2
y obtener tamaños no solo para las carpetas seleccionadas sino también para sus subcarpetas
1. | DIR: d: / ir | TAMAÑO: 325.72 Mb | PROFUNDIDAD: 1 2. | DIR: d: / ir / paquete | TAMAÑO: 212.88 Mb | PROFUNDIDAD: 2 3. | DIR: d: / go / src | TAMAÑO: 62.57 Mb | PROFUNDIDAD: 2 4. | DIR: d: / ir / bin | TAMAÑO: 30.44 Mb | PROFUNDIDAD: 2 5. | DIR: d: / Libros / Ajedrez | TAMAÑO: 14.01 Mb | PROFUNDIDAD: 2 6. | DIR: d: / Libros | TAMAÑO: 14.01 Mb | PROFUNDIDAD: 1 7. | DIR: d: / ir / api | TAMAÑO: 6.41 Mb | PROFUNDIDAD: 2 8. | DIR: d: / ir / prueba | TAMAÑO: 5.11 Mb | PROFUNDIDAD: 2 9. | DIR: d: / go / doc | TAMAÑO: 4.00 Mb | PROFUNDIDAD: 2 10. | DIR: d: / ir / misceláneo | TAMAÑO: 3.82 Mb | PROFUNDIDAD: 2 11. | DIR: d: / go / lib | TAMAÑO: 358.25 Kb | PROFUNDIDAD: 2
* 3.5Tb en el servidor ha sido escaneado por 3m12s
Aquí viene un código de PowerShell que escribo para enumerar el tamaño y el recuento de archivos para todas las carpetas en el directorio actual. Siéntase libre de reutilizar o modificar según sus necesidades.
$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
}
$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}} }
Esto proporcionará objetos (más Powershell-ish), 'FileCount' y 'Size' son enteros (por lo que puede procesarlos más tarde, si es necesario), y 'Size' está en bytes, pero podría convertirlo fácilmente a GB (o la unidad que desee) con $Data.Size / 1GB
.
$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}} }
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
Supongo que esto solo funcionaría si el directorio es bastante estático y su contenido no cambia entre la ejecución de los dos comandos dir. Tal vez una forma de combinar esto en un comando para evitar eso, pero esto funcionó para mi propósito (no quería la lista completa; solo el resumen).
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%
Uso:
GetDirSummary.bat c: \ temp
Salida:
Total Files Listed:
22 File(s) 63,600 bytes
8 Dir(s) 104,350,330,880 bytes free
Llegué du.exe
con mi distribución git. Otro lugar podría ser Microsoft o Unxutils mencionados anteriormente .
Una vez que tengas du.exe en tu camino. Aquí está tu 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
Creo que su única opción será diruse (una solución de terceros altamente compatible):
Obtener el tamaño del archivo / directorio desde la línea de comando
La CLI de Windows es, por desgracia, bastante restrictiva, también puede instalar Cygwin, que es un sueño usar en comparación con cmd. Eso le daría acceso a la herramienta de Unix portada, que es la base de diruse en Windows.
Lo siento, no pude responder sus preguntas directamente con un comando que puede ejecutar en el cli nativo.
:: Obtenga una cantidad de líneas que los comandos Dir devuelven (/ -c para eliminar los separadores de números:.,) ["Tokens = 3" para mirar solo 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 archivos:
set /a line=%i%-1
Finalmente obtenga el número de bytes en la penúltima línea - 3ra 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 la búsqueda por palabras, no tendría problemas de idioma.
Limitaciones:
Tratar:
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
Cambie C: \ Archivos de programa a la carpeta que desee y cambie% A a %% A si lo usa en un archivo por lotes
Devuelve el tamaño de 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ás que usar un archivo provisional si no quieres eso.
La siguiente secuencia de comandos se puede utilizar para recuperar y acumular el tamaño de cada archivo en una carpeta determinada.
La ruta de la carpeta %folder%
se puede proporcionar como argumento para este script ( %1
).
En última instancia, los resultados se mantienen en el parámetro%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
Nota: El método calcAccSize
también puede imprimir el contenido de la carpeta (comentado en el ejemplo anterior)
Así que aquí hay una solución para sus dos solicitudes de la manera que solicitó originalmente. Le dará un tamaño de archivo de legibilidad humana sin los límites de tamaño de archivo que todos están experimentando. Compatible con Win Vista o más reciente. XP solo está disponible si Robocopy está instalado. Simplemente suelte una carpeta en este archivo por lotes o utilice el mejor método mencionado a continuación.
@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
Para poder utilizar este archivo por lotes, colóquelo convenientemente en su carpeta SendTo. Esto le permitirá hacer clic derecho en una carpeta o selección de carpetas, hacer clic en la opción Enviar a y luego seleccionar este archivo por lotes.
Para encontrar la carpeta SendTo en su computadora, la forma más simple es abrir cmd y luego copiar en esta línea tal como está.
explorer C:\Users\%username%\AppData\Roaming\Microsoft\Windows\SendTo
Resolví un problema similar. Algunos de los métodos en esta página son lentos y otros son problemáticos en un entorno 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, por ejemplo
FOR /F %%? IN ('CSCRIPT //NOLOGO %TEMP%\_SFSTMP$.VBS') DO (ECHO "Size of %1 is %%?"&&(DEL %TEMP%\_SFSTMP$.VBS))
Puede usarlo como subrutina o como cmd independiente. El parámetro es el nombre de la carpeta probada cerrada entre comillas.