Obtenha o tamanho do arquivo em KB/MB/GB no arquivo em lote do Windows

Obtenha o tamanho do arquivo em KB/MB/GB no arquivo em lote do Windows

Eu tenho um arquivo em lote do Windows (Windows 7/2008 R2) que faz backup diário do arquivo. (Arquivo de exportação de despejo Oracle, por exemplo, dump-2016-10-17.DMP)

Quero adicionar o tamanho do ARQUIVO (em uma variável) que deve estar em KB/MB/GB de acordo com o tamanho, ou pelo menos deve ter o tamanho do arquivo em 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

Responder1

Como alternativa, você pode usar a saída do robocopycomando para recuperar as informações necessárias

@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] 
    )

robocopyserá usado para listar apenas ( /l) as informações do arquivo que está sendo copiado, removendo quaisquer informações desnecessárias da saída (o resto das opções) e usando um for /fcomando para tokenizar as linhas de saída e ler apenas o tamanho do arquivo

No caso de pastas, a mesma ideia pode ser usada, mas em vez de ler os dados da lista de arquivos, podemos usar um método recursivo"cópia de"e recuperar os dados do resumo do trabalho

@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%]

As opções foram alteradas para recuperar apenas o resumo do trabalho e filtradas para ler apenas a linha que contém as Bytesinformações.

editado26/10/2016 - alterou as opções de robocopy para enfrentar problemas de permissão, alterou Byte:a recuperação para :filtro de linha mais cláusula de salto apenas no caso de haver um local sem a Bytes:string, alterou a detecção da unidade de armazenamento.

Responder2

Uma solução seria chamar o lote de dentro do outro lote e fazer com que o arquivo de backup fosse o argumento. Você obteria o tamanho como um texto e poderia salvá-lo em uma variável.

Para fazer isso "inline" você poderia usá-lo em um loop como este:

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

Do ponto de vista da legibilidade, a primeira solução seria melhor.

Responder3

Obrigado pelo apoio e orientações.

Finalmente consegui resolver o problema baixando o lsfor windows e usando ls -lh filenameestou obtendo as informações necessárias junto com outras informações também.

Exemplo:

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

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

Responder4

Você precisará de duas coisas.

filesize.bat 

@echo off
echo %~z1

E então o que você está realmente tentando avaliar é o valor relatado aqui

Portanto, neste exemplo eu avalio %z% para copiar um arquivo somente se for maior que zero/copiar apenas um arquivo diferente de zero

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

Algo como chegar a% z% permite que você faça alguma matemática de truncamento ou algo assim, mas obter o tamanho em si é um pouco trabalhoso.

informação relacionada