Obtener el tamaño del disco/partición en un archivo por lotes

Obtener el tamaño del disco/partición en un archivo por lotes

Cómo llegartamaño totalde un disco o partición (un disco duro USB con 1 partición NTFS) en un archivo por lotes?
Preferiría no optar por una lógica que revise los archivos de forma recursiva (los que tienen for /f), ya que es una unidad de 1 TB y puede llevar mucho tiempo determinar el tamaño.

Estoy dispuesto a utilizar alguna pequeña herramienta de terceros que devolverá el tamaño al archivo por lotes.

PD: estoy en Windows 7 x64 Ultimate

Respuesta1

Probablemente haya una manera más fácil de hacer esto, pero esta es la que yo uso.

Si todo lo que desea son los bytes, puede hacer este comando y cambiar T a la letra de unidad de su dispositivo externo (para una sola línea en el símbolo del sistema, cambie %%a %y set space=a echo)

for /f "tokens=3 delims= " %%a in ('dir /-c T: ^| find "bytes free"') do set space=%%a

Si quieres entonces toma eso y simplifícalo, primero establece pautas para cada tamaño.

set divide=1073741824&&set size=gigabytes
if %space% lss 1073741824 set divide=1048576&&set size=megabytes
if %space% lss 1048576 set divide=1024&&set size=kilobytes
if %space% lss 1024 set divide=1&&set size=bytes

Luego escriba un script VBS temporal ya que el lote no puede manejar las matemáticas

echo wsh.echo cdbl(%space%)/%divide% > %temp%\tmp.vbs

Ejecútelo, capture el resultado y elimínelo.

for /f %%a in ('cscript //nologo %temp%\tmp.vbs') do set space=%%a
del %temp%.\tmp.vbs

Luego lo siguiente recorta el resultado a dos decimales.

for /f "tokens=1,2 delims=." %%a in ("%space%") do (
  set s1=%%a
  set s2=%%b
)
if not "%s2%"=="" (set space=%s1%.%s2:~0,2%) else (set space=%s1%)

Resultados del eco

echo Drive has %space% %size% free.

[EDITAR]

Paratotaltamaño, puede usar el volumen de la lista de diskpart (cambiar "%%a"=="T"a "%%a"=="driveletterhere")

for /f "tokens=3,6,7 delims= " %%a in ('echo list volume ^| diskpart') do if "%%a"=="T" set size=%%b && set size2=%%c

y bonificación de cómo podrías calcular eso:

if [%size2%]==[TB] (
    set isBigEnough=1
) else if [%size2%]==[GB] (
    if %size% GTR 31 set isBigEnough=1
)
if not defined isBigEnough set isBigEnough=0

Respuesta2

Quizás pruebe df.execuál está disponible enhttp://unxutils.sourceforge.net/y otras ubicaciones. Esta es una copia de una herramienta de línea de comandos de UNIX.

También debería poder obtener el valor directamente desde la Interfaz de administración de Windows (WMI), aunque me temo que mis habilidades en esa área no son lo suficientemente buenas para dar una respuesta directa.

fsutil volume diskfree c:le dará 3 líneas de salida que probablemente podría usar findpara obtener el resultado que desea.

Salida de ejemplo:

Total # of free bytes        : 466333454336
Total # of bytes             : 972999880704
Total # of avail free bytes  : 466333454336

fsutil volume diskfree c: | find "Total # of bytes"te da una línea específica.

for /F "tokens=2 delims=:" %i in ('fsutil volume diskfree c: ^| find "Total # of bytes"') do @set USED=%i

le da el número con un espacio anterior.

Para una comparación:

@REM 32MB = 32*1024*1024 bytes
@set COMP=33554432

@REM Pull out the line containing the number of bytes USED
for /F "tokens=2 delims=:" %i in ('fsutil volume diskfree c: ^| find "Total # of bytes"') do @set USED=%i

@REM Drop the leading space character to just get the number so a numeric comparison is done
for /F "tokens=1 delims= " %i in ('echo %USED%') do @set USED=%i

@REM Tell me something useful
if %USED% lss %COMP% @echo "Used is less than 32MB"
if %USED% gtr %COMP% @echo "Used is greater than 32MB"

NOTA: fsutil requiere derechos de administrador, por lo que es posible que esto no funcione en computadoras bloqueadas.

información relacionada