
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 robocopy
comando 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]
)
robocopy
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 modificadores) y usando un for /f
comando 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 Bytes
informació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 ls
para Windows y al usarlo ls -lh filename
obtengo 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.