
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 robocopy
comando 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 quaisquer informações desnecessárias da saída (o resto das opções) e usando um for /f
comando 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 Bytes
informaçõ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 ls
for windows e usando ls -lh filename
estou 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.