Obtener el tamaño del archivo en KB/MB/GB en un archivo por lotes de Windows

Obtener el tamaño del archivo en KB/MB/GB en un archivo por lotes de Windows

Tengo un archivo por lotes de Windows (Windows 7/2008 R2) que realiza una copia de seguridad diaria del archivo (archivo de exportación de volcado de Oracle, por ejemplo, dump-2016-10-17.DMP).

Quiero agregar el tamaño del ARCHIVO (en una variable) que debería estar en KB/MB/GB según el tamaño, o al menos debería obtener el tamaño del archivo en MB. CÓDIGO:

@echo off
SET DONE=0
SET Bytes=%~z1
SET KB=%Bytes:~0,-3%
SET MB=%Bytes:~0,-6%
SET GB=%Bytes:~0,-9%
SET TB=%Bytes:~0,-12%
rem echo %~f1

IF "%KB%" EQU "" SET DONE=B
IF %DONE% EQU B echo Size is... %Bytes% Bytes
IF %DONE% EQU B GOTO END

IF "%MB%" EQU "" SET DONE=K
IF %DONE% EQU K SET /a KB=(%BYTES%/1024)+1
IF %DONE% EQU K echo Size is... %KB% KB
IF %DONE% EQU K GOTO END

IF "%GB%" EQU "" SET DONE=M
IF %DONE% EQU M SET /a MB=(%BYTES%/1048576)+1
IF %DONE% EQU M echo Size is... %MB% MB
IF %DONE% EQU M GOTO END

IF "%TB%" EQU "" SET DONE=M
IF %DONE% EQU M SET /a MB=%KB%/1049
IF %DONE% EQU M echo Size is... %MB% MB (approx)
IF %DONE% EQU M GOTO END

SET DONE=G
IF %DONE% EQU G SET /a GB=%MB%/1074
IF %DONE% EQU G echo Size is... %GB% GB (approx)
IF %DONE% EQU G GOTO END
:END

Respuesta1

Como alternativa, puede utilizar la salida del robocopycomando para recuperar la información requerida.

@echo off
    setlocal enableextensions disabledelayedexpansion

    set "file=d:\somewhere\file.ext"

    for %%z in ("%file%") do for /f "tokens=1,2" %%a in ('
        robocopy "%%~dpz." "%%~dpz." "%%~nxz" /l /nocopy /is /njh /njs /ndl /nc
    ') do if "%%~dz"=="%%~db" (
        echo "%%~z" : [%%a]
    ) else (
        echo "%%~z" : [%%a%%b] 
    )

robocopyse usará solo para enumerar ( /l) la información del archivo que se está copiando, eliminando cualquier información no necesaria de la salida (el resto de los modificadores) y usando un for /fcomando para tokenizar las líneas de salida y leer solo el tamaño del archivo.

En el caso de las carpetas se puede utilizar la misma idea, pero en lugar de leer los datos de la lista de archivos, podemos utilizar un método recursivo."Copiar"y recuperar los datos del resumen del trabajo

@echo off
    setlocal enableextensions disabledelayedexpansion

    set "folder=%~f1" & if not defined folder set "folder=%cd%"

    set "size=" & for %%z in ("%folder%") do for /f "skip=2 tokens=2,3 delims=: " %%a in ('
        robocopy "%%~fz\." "%%~fz\." /l /nocopy /s /is /njh /nfl /ndl /r:0 /w:0 /xjd /xjf /np
        ^| find ":"
    ') do if not defined size (
        (for /f "delims=0123456789." %%c in ("%%b") do (break)) && (
            set "size=%%a%%b"
        ) || (
            set "size=%%a"
        )
    )

    echo "%folder%" : [%size%]

Los modificadores cambiaron para recuperar solo el resumen del trabajo y se filtraron para leer solo la línea que contiene la Bytesinformación.

editado26/10/2016: se cambiaron los interruptores de robocopy para enfrentar problemas de permisos, se cambió Byte:la recuperación al :filtro de línea más la cláusula de omisión en caso de que haya una configuración regional sin la Bytes:cadena, se cambió la detección de la unidad de almacenamiento.

Respuesta2

Una solución sería llamar al lote desde el otro lote y hacer que el archivo de copia de seguridad sea el argumento. Obtendría el tamaño como texto y podría guardarlo en una variable.

Para hacerlo "en línea", puedes usarlo en un bucle como este:

for %f in (%backupfile%) do set BYTES=%~zf

Desde una perspectiva de legibilidad, la primera solución sería mejor.

Respuesta3

Gracias por el apoyo y las pautas.

Finalmente logré resolverlo descargando el archivo lspara Windows y al usarlo ls -lh filenameobtengo la información que necesitaba junto con otra información también.

Ejemplo:

D:\zaib>D:\tools\ls.exe -lh setup.exe

-rwxr-x--a  1 Administrators   590M Oct  6  2015 setup.exe

Respuesta4

Necesitarás dos cosas.

filesize.bat 

@echo off
echo %~z1

Y luego, lo que en realidad estás intentando es evaluar el valor reportado aquí.

Entonces, en este ejemplo evalúo %z% para copiar un archivo solo si es mayor que cero/copiar solo un archivo distinto de cero

for /f %i in ('filesize filesize.bat') do set z=%i
if %z% gtr 0 ( copy filesize.bat noodles.bat )

Algo como llegar a %z% te permite hacer algunos cálculos de truncamiento o algo así, pero obtener el tamaño en sí es un poco complicado.

información relacionada