scripting - subdirectorios - Archivo por lotes para mostrar el tamaño del directorio
ver tamaño de archivos ubuntu (6)
Hola chicos, me pregunto si pueden ayudarme a modificar este guión con el que he estado jugando, no puedo permitir que acepten comodines ''*''
@echo off
setLocal EnableDelayedExpansion
set /a value=0
set /a sum=0
FOR /R %1 %%I IN (*) DO (
set /a value=%%~zI/1024
set /a sum=!sum!+!value!
)
@echo Size is: !sum! k
Está en un archivo por lotes llamado dirsize y se llama así
dirsize c:/folder
Quiero que revise los tamaños de las carpetas, este es un ejemplo, el caché en firefox
dirsize C:/users/%username%/AppData/Local/Mozilla/Firefox/*.default/Cache
Devuelve el valor 0
Pero si voy
dirsize C:/users/%username%/AppData/Local/Mozilla/Firefox/sr1znnb4.default/Cache
Funciona y obtengo el valor 55322 devuelto. ¿Ayuda por favor? Gracias por adelantado gente amable
Debería ajustar lo que tiene actualmente en otro bucle for
que expande *
en una serie de directorios.
Asi que
@echo off
setLocal EnableDelayedExpansion
set /a sum=0
for /d %%D in (%1) do (
FOR /R %%D %%I IN (*) DO (
set /a value=%%~zI/1024
set /a sum=!sum!+!value!
)
)
echo Size is: !sum! k
podría funcionar (aún no probado, pero debería darle la idea general)
Si tiene una versión de Windows de grep
(puede encontrar una en las utilidades de GNU para Win32 ) puede hacer algo como esto:
dir /s %1 | grep --after-context=1 "Total Files Listed:"
PowerShell lo hace fácil, por supuesto:
(gci . -Recurse | Measure-Object -Property Length -Sum).Sum
Y PowerShell ya está instalado en Windows 7. ¡Súbete al carro! :-)
Además, C:/users/%USERNAME%/AppData/
no es una forma confiable de encontrar AppData. Pruebe %APPDATA%
(o $env:APPDATA
en PowerShell).
Bien para empezar, digamos que los comodines no son bien compatibles en los archivos por lotes, y especialmente en los bucles .
Eso es lo que se me ocurrió:
DirSize.cmd " ruta válida "
@echo off
rem Args[1]= "Path" or "valid path with wildcard"
set _size=0
set dRaw=%~1
echo %~1|findstr "*"&& set dSource=%~dp1|| (
set dSource=%~1/
if not "%dRaw:~-1%"=="/" set dRaw=%dRaw%/
)
for /f "delims=" %%D in (''dir /ad /b %dRaw%'') do call :DirSize "%dSource%%%~D"
set /a size=_size/1024
echo size=%size% k (%_size% bytes)
exit /b 0
:DirSize
call :FileSize "%~1"
for /f "delims=" %%d in (''dir /ad /b "%~1"2^>nul'') do call :DirSize "%~1/%%~d"
exit /b 0
:FileSize
for /f "delims=" %%f in (''dir /a-d /b "%~1/"2^>nul'') do for %%F in (%1/%%f) do set /a _size+=%%~zF
exit /b 0
___Uso___
Argumento: debe ser una ruta (no un archivo) que contenga comodines o no. La ruta de acceso necesita ser válida al escribir ruta de acceso a directorios
___Notes___
Este script comprueba todos los archivos y subdirectorios, incluso los ocultos / del sistema. cambie el argumento dir / a y agregue -hs (like / ad-hs) para eliminar este comportamiento.
Revisé el argumento revisando a mi gusto ahora, así que creo que es útil.
Espero que esto ayude.
Este código aumentará el límite de tamaño de directorio hasta 2,000,000 TB y mostrará más tamaño real, lo que sería útil si la carpeta contiene demasiados archivos.
rem SET DIR=%1
SET DIR=C:/DIR1/
IF NOT EXIST "%DIR%" (
ECHO Directory "%DIR%" does not exist.
goto END
)
setlocal EnableDelayedExpansion
set GB=
set SIZE=
set exp=000000000
FOR /R "%DIR%" %%F IN (*) DO (
set /a SIZE=!SIZE!+%%~zF
if !SIZE! geq 1!exp! (
set /a GB=!GB!+!SIZE:~0,-9!
for /f "tokens=* delims=0" %%a in ("!SIZE:~-9!") do set SIZE=%%a
)
)
if not defined SIZE set SIZE=0
if not defined GB goto EOS
FOR /L %%N IN (1,1,9) DO (
if "!SIZE:~%%N!" == "" (
set SIZE=!GB!!exp:~%%N!!SIZE!
goto EOS
)
)
:EOS
call :Divide !SIZE! 1024 SIZEKB
echo Size is: !SIZE!B (!SIZEKB!kB)
endlocal
:END
pause
exit
:Divide
set Num1=%~1
set Num2=%~2
set %3=
set Num=
set Number=
IF !Num2! EQU 0 goto :EOF
FOR /L %%N IN (0,1,18) DO (
if "!Num1:~%%N!" == "" goto :EOD
set Number=!Number!!Num1:~%%N,1!
if !Number! geq !Num2! (
set /a quotient=!Number!/!Num2!
set /a Number=!Number!-!quotient!*!Num2!
if !Number! equ 0 set Number=
set Num=!Num!!quotient!
) else (
if defined Num set Num=!Num!0
)
)
:EOD
if not defined Num set Num=0
set %3=%Num%
goto :EOF
10 veces más rápido que hacerlo a través de FOR. Con la ventaja de poder usar cualquiera de los parámetros permitidos del comando DIR (en este caso / S)
@ECHO OFF
SET folder="C:/WINDOWS"
call:timer
ECHO Processing, please wait...
CALL :folderSize size %folder% "/S"
CALL :strNumDivide sizeKb %size% 1024
CALL :strNumDivide sizeMb %sizeKb% 1024
CALL :strNumDivide sizeGb %sizeMb% 1024
CALL :formatNumber size %size%
CALL :formatNumber sizeKb %sizeKb%
CALL :formatNumber sizeMb %sizeMb%
CALL :formatNumber sizeGb %sizeGb%
ECHO.
ECHO Size of %folder%:
ECHO.
ECHO %size% bytes
ECHO %sizeKb% Kb
ECHO %sizeMb% Mb
ECHO %sizeGb% Gb
ECHO.
pause
exit /b
:: Function to calculate the size of a directory and its subdirectories
::----------------------------------------------------------------------
:folderSize <returnVariableName> <folder> [DIR parameters]
SetLocal EnableExtensions EnableDelayedExpansion
SET folder=%2
SET params=%~3
IF NOT DEFINED folder SET folder="%CD%"
DIR %params% /W "%folder:"=%" > %TEMP%/folderSize.tmp
FOR /F "tokens=1 delims=:" %%x IN (''findstr /n /e ":" %TEMP%/folderSize.tmp'') DO (SET line=%%x)
IF DEFINED line (
SET /A line = !line! + 1
FOR /F "tokens=4 delims= " %%i IN (''findstr /n "bytes" %TEMP%/folderSize.tmp^|findstr "!line!:"'') DO (SET size=%%i)
SET size=!size:.=!
) ELSE (
FOR /F "tokens=3 delims= " %%i IN (''findstr /e "bytes" %TEMP%/folderSize.tmp'') DO (SET size=%%i)
SET size=!size:.=!
)
DEL %TEMP%/folderSize.tmp > nul
EndLocal & SET "%~1=%size%"
GOTO:EOF
:: Extras functions to convert between different units and to give numerical format
:: --------------------------------------------------------------------------------
:strNumDivide <returnVariableName> <stringNum> <divisor>
SetLocal EnableExtensions EnableDelayedExpansion
SET strNum=%~2
SET divisor=%~3
SET result=
SET number=
IF !divisor! EQU 0 GOTO:EOF
FOR /L %%n IN (0,1,18) DO (
IF NOT "!strNum:~%%n!" == "" (
SET number=!number!!strNum:~%%n,1!
IF !number! GEQ !divisor! (
SET /A quotient=!number! / !divisor!
SET /A number=!number! - !quotient! * !divisor!
IF !number! EQU 0 SET number=
SET result=!result!!quotient!
) ELSE (
IF DEFINED result SET result=!result!0
)
)
)
IF NOT DEFINED result SET "result=0"
EndLocal & SET "%~1=%result%"
GOTO:EOF
:formatNumber <returnVariableName> <number> [separator [group size]]
SetLocal EnableExtensions EnableDelayedExpansion
SET "raw=%~2"
SET "separator=%~3"
SET "group=%~4"
SET "answer="
IF NOT DEFINED raw GOTO :EOF
IF NOT DEFINED separator SET "separator=."
IF NOT DEFINED group SET "group=3"
FOR %%g IN (-%group%) DO (
FOR /F "tokens=1,2 delims=,." %%a IN ("%raw%") DO (
SET int=%%a
SET frac=%%b
FOR /F "delims=:" %%c IN (''^(ECHO;!int!^& Echo.NEXT LINE^)^|FindStr /O "NEXT LINE"'') DO (
SET /A length=%%c-3
)
FOR %%c IN (!length!) DO (
SET radix=!raw:~%%c,1!
)
FOR /L %%i IN (!length!, %%g, 1) DO (
SET answer=!int:~%%g!!separator!!answer!
SET int=!int:~0,%%g!
)
)
)
SET answer=%answer: =%
SET answer=%answer:~0,-1%
EndLocal & SET "%~1=%answer%%radix%%frac%"
Goto :EOF
Ejemplo de resultado de salida: (en el ejemplo, la rutina tardó 3 segundos en calcular el tamaño de C: / WINDOWS con un tamaño de 28 GB)
Processing, please wait...
Size of "C:/WINDOWS":
30.936.389.769 bytes
30.211.318 Kb
29.503 Mb
28 Gb
Elapsed Time: 3 secs