
У меня есть пакетный файл Windows (Windows 7/2008 R2), который ежедневно создает резервную копию файла (файл экспорта дампа Oracle, например dump-2016-10-17.DMP).
Я хочу добавить размер ФАЙЛА (в переменной), который должен быть в КБ/МБ/ГБ в зависимости от размера, или, по крайней мере, он должен получить размер файла в МБ. КОД:
@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
решение1
В качестве альтернативы вы можете использовать вывод robocopy
команды для получения необходимой информации.
@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
будет использоваться только для перечисления ( /l
) информации о копируемом файле, удаляя всю ненужную информацию из вывода (остальные переключатели) и используя команду for /f
для токенизации строк вывода и чтения только размера файла
В случае с папками можно использовать ту же идею, но вместо чтения данных из списка файлов мы можем использовать рекурсивный"копия"и извлечь данные из резюме задания
@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%]
Параметры изменены для извлечения только сводки задания и отфильтрованы для чтения только строки, содержащей информацию Bytes
.
отредактировано2016/10/26 - изменены переключатели Robocopy для решения проблем с разрешениями, изменен Byte:
поиск на :
фильтрацию строк и пропуск предложения на случай, если есть локаль без Bytes:
строки, изменено определение единицы хранения.
решение2
Одним из решений было бы вызвать пакет из другого пакета и сделать файл резервной копии аргументом. Вы бы получили размер в виде текста и могли бы сохранить его в переменной.
Чтобы сделать это «встроенным», вы можете использовать его в цикле следующим образом:
for %f in (%backupfile%) do set BYTES=%~zf
С точки зрения читабельности первое решение было бы лучше.
решение3
Спасибо за поддержку и рекомендации.
Мне наконец удалось решить эту проблему, загрузив ls
для Windows, и используя ее, ls -lh filename
я получаю необходимую мне информацию вместе с другой информацией.
Пример:
D:\zaib>D:\tools\ls.exe -lh setup.exe
-rwxr-x--a 1 Administrators 590M Oct 6 2015 setup.exe
решение4
Вам понадобятся две вещи.
filesize.bat
@echo off
echo %~z1
И тогда вы на самом деле пытаетесь оценить значение, указанное здесь
Итак, в этом примере я оцениваю %z%, чтобы копировать файл, только если его размер больше нуля / копировать только ненулевой файл
for /f %i in ('filesize filesize.bat') do set z=%i
if %z% gtr 0 ( copy filesize.bat noodles.bat )
Что-то вроде %z% позволяет вам выполнить некоторые математические операции усечения или что-то в этом роде, но само получение размера — это немного утомительно.