Obtém o tamanho do arquivo em KB / MB / GB no arquivo em lotes do Windows

0

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

Eu 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 obter 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
    
por Syed Jahanzaib 17.10.2016 / 09:24

3 respostas

1

Apenas como alternativa, você pode usar a saída do comando robocopy 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] 
    )

robocopy será usado para listar apenas ( /l ) as informações do arquivo que está sendo copiado, removendo qualquer informação não necessária da saída (o restante dos comutadores) e usando um comando for /f para tokenizar o arquivo linhas de saída e leia 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 uma "cópia" recursiva e recuperar os dados do resumo da tarefa

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

Comutadores alterados para recuperar apenas o resumo do trabalho e filtrados para apenas ler a linha que contém as informações Bytes .

editado 2016/10/26 - mudou as opções de robocopy para problemas de permissão, alterou Byte: retrieval para : line filter mais ignorar a cláusula caso haja uma localidade sem o Bytes: string, alteração da detecção da unidade de armazenamento.

    
por 18.10.2016 / 13:21
0

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

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

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

De uma perspectiva de legibilidade, a primeira solução seria melhor.

    
por 17.10.2016 / 11:07
-1

Obrigado pelo apoio e pelas diretrizes.

Eu finalmente consegui resolvê-lo fazendo o download do ls para windows, e usando ls -lh filename estou obtendo as informações que solicitei 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
    
por 17.10.2016 / 12:34