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 de ARCHIVO (en una variable) que debería estar en KB / MB / GB de acuerdo con 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
windows
windows-8
batch-file
Syed Jahanzaib
fuente
fuente
@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% echo %~f1 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 :END
Respuestas:
Como alternativa, puede usar la salida del
robocopy
comando para recuperar la información requeridarobocopy
se 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 conmutadores) y usando unfor /f
comando para tokenizar las líneas de salida y leer solo el tamaño del archivoEn el caso de las carpetas, se puede usar la misma idea, pero en lugar de leer los datos de la lista de archivos, podemos usar una "copia" recursiva y recuperar los datos del resumen del trabajo
Los interruptores cambiaron para recuperar solo el resumen del trabajo y se filtraron para leer solo la línea que contiene la
Bytes
información.editado el 26/10/2016 - se cambiaron los interruptores de robocopy para enfrentar problemas de permisos, se cambió la
Byte:
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 laBytes:
cadena, se modificó la detección de la unidad de almacenamiento.fuente
Una solución sería llamar al lote desde su otro lote y hacer que el archivo de respaldo sea el argumento. Obtendría el tamaño como texto y podría guardarlo en una variable.
Para hacerlo "en línea" puede usarlo en un bucle como este:
Desde una perspectiva de legibilidad, la primera solución sería mejor.
fuente
Gracias por el apoyo y las pautas.
Finalmente logré resolverlo descargando el
ls
para Windows, y usandols -lh filename
estoy obteniendo la información que necesitaba junto con otra información también.Ejemplo:
fuente