Сравнить размер одного и того же файла в командном файле - PullRequest
0 голосов
/ 29 августа 2018

У меня есть 1 задача, при которой 1 генерация файла запускается через БД, а генерация заняла почти 1 час, есть 1 пакетный файл, который проверяет этот файл всякий раз, когда он становится доступным, вызывает новый пакетный файл и вызывает «отправленный файл», проблема в том, что этот файл, который генерируется непрерывно, не был полностью сгенерирован в файле, выбранном одинаково, и вызывает командный файл

Что я хочу сделать, чтобы построить логику, в которой я могу сравнить размер файла в цикле с 2 переменными sizeA и sizeB и вызвать другой пакетный файл, когда sizeA == sizeB. Теперь единственная проблема - я не уверен, как встроить эту логику в код. \

Вот что я пробовал:

@echo off
setlocal EnableDelayedExpansion
set file = "C:\Users\rb54761\Desktop\New folder\File.txt"
set "size=0"
pause
:loop for /f "tokens=*" %%x in ('dir /s /a /b "%file%"2^>nul') do set /a size=%%~zx
echo !size!
PAUSE
if !size! == !size! goto call
goto loop 
:call echo Success

Ответы [ 3 ]

0 голосов
/ 30 августа 2018

Мы можем использовать следующий подход, чтобы сравнить размер одного и того же файла за промежуток времени

@echo off
setlocal EnableDelayedExpansion
set file="d:\File_Mask1\New_File\File.txt"
set "size=0"

If exist %file% GOTO loop
GOTO nofile

:loop
for /f "tokens=*" %%x in ('dir /s /a /b %file%') do set /a size=%%~zx
echo !size!

waitfor SomethingThatIsNeverHappening /T 120 >nul 2>&1

for /f "tokens=*" %%y in ('dir /s /a /b %file%') do set /a size1=%%~zy
echo !size1!
if !size! EQU !size1! goto call
goto loop

:call
echo Success
endlocal
0 голосов
/ 30 августа 2018

Это использует атрибут архива. Windows устанавливает этот атрибут каждый раз, когда записывает в файл. Так что, если мы можем сбросить его, подождите некоторое время и проверьте его (я использую dir /aa, который не найдет файл, когда атрибут не установлен)

@echo off
set sec=10
set "file="C:\Users\rb54761\Desktop\New folder\File.txt""
set /a secs=sec+1
:loop
  attrib -a "%file%"
  timeout %sec% >nul
  dir /b /aa "%file%" >nul 2>&1 || goto :loop
echo %file% didn't change since %secs% seconds

(Примечание: ваша строка set file = ... неверна. Пробелы вокруг = станут частью имени переменной, соответствующего значению)

Преимущество: нет ограничения по размеру файла (файлы размером более 2 ГБ будут также обрабатываться нормально)

0 голосов
/ 29 августа 2018

РЕДАКТИРОВАТЬ Теперь я видел только ваш комментарий как файл размером 2 ГБ, тогда приведенный ниже код не будет работать.

Если файл должен быть меньше .. вот пример:

@echo off
set "myfile=C:\Users\rb54761\Desktop\New folder\File.txt"
:start
for /f %%I in ("%myfile%") do set size=%%~zI
if %size% LSS 100 (echo file not ready %size% & timeout /t 10 & goto :start)
echo copy file.

, как указано выше, он проверит файл на размер 100 КБ, если еще не тот размер, он остановится на 10 секунд, перейдет к началу и протестирует снова, пока файл не достигнет 100 КБ, где он больше не будет соответствовать если заявление и передать эту строку и просто эхо copy file.

Обратите внимание, что в моих командах set нет пробелов. Я бы посоветовал вам запустить из cmd справку for /?, чтобы узнать больше об этой команде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...