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


0

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

¿Consideró usar un script de PowerShell en lugar de un lote? De lo contrario, esto podría ayudar: stackoverflow.com/questions/1199645/…
Seth

Ok, tengo esto de internet. pero esto requiere que ingrese el nombre del archivo. ¿Cómo puedo agregar el nombre del archivo dentro de este código para evitar agregar argumentos en el momento de la ejecución? @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
Syed Jahanzaib

Edite su pregunta inicial con ese código. Esta cosa ilegible es inutilizable en esa forma. Para tener una idea de cómo integrar el nombre de archivo, tendría que publicar su código real y no solo un fragmento que encontró que hace otra cosa. El mejor enfoque sería tener dos bloques de código, uno con su código y otro con el código que encontró y le gustaría integrar. Probablemente esto sea aún más fácil en PowerShell.
Seth

Gracias por la sugerencia. He editado la pregunta original para agregar el código. Solo quiero agregar un nombre de archivo estático en este código. como FNAME = d: \ setup.exe para que el script procese el FNAME,
Syed Jahanzaib

Respuestas:


1

Como alternativa, puede usar 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 conmutadores) 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 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

@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 interruptores cambiaron para recuperar solo el resumen del trabajo y se filtraron para leer solo la línea que contiene la Bytesinformació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 la Bytes:cadena, se modificó la detección de la unidad de almacenamiento.


¿Cómo puedo usar el mismo comando por lotes para obtener el tamaño de la carpeta?
Syed Jahanzaib

@SyedJahanzaib, ¿Qué quieres decir con "tamaño de carpeta" ? Archivos dentro de la carpeta? , archivos debajo de la carpeta y cualquier subcarpeta ?, ...?
MC ND

ejemplo, quiero obtener el tamaño completo de la carpeta D: \ temp. Podría haber subdirectorios como D: \ temp \ 1 d: \ temp \ 2 Por lo tanto, quiero el tamaño completo de la carpeta D: \ temp.
Syed Jahanzaib

el resultado debe ser una sola entrada como D: \ temp = size = 900M o 5GB
Syed Jahanzaib

@SyedJahanzaib, respuesta actualizada.
MC ND

0

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:

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

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


-1

Gracias por el apoyo y las pautas.

Finalmente logré resolverlo descargando el lspara Windows, y usando ls -lh filenameestoy obteniendo 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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.