2013-02-12 3 views
0

У меня есть файл, который непрерывно написанный с информацией, как этотПакетный сценарий прочитать файл, который непрерывно написанный

HU/GEN/TCfg/цель/Хасинто/стартер/starter_b1.cfg

32.77 34 % 141.59kB/с 0:00:00

94,64 100% 405.35kB/с 0:00:00 (XFER # 60, чтобы проверка = 1002/1097)

это выход инструмент rsync, это копирование са папку на другой путь

Я пытаюсь написать пакетный скрипт, который считывает этот файл и вычисляет общее количество данных, скопированных, сосредоточив внимание на этой линии

94,64 100% 405.35kB/сек 0 : 00: 00 (XFER # 60, к проверке = 1002/1097)

число 94,64 является размер файла в байтах, поэтому я предполагаю, что я должен извлечь все, что прежде, чем «100%» от line и добавить его

Но я не знаю, как постоянно читать файл, когда он записывается одновременно

Может ли кто-нибудь помочь?

Благодаря

+1

Невозможно из пакетного файла AFAIK. Если вы можете перенаправить вывод инструмента rsync в пакетный файл, тогда он должен быть выполнимым. – Jon

+1

Я бы использовал 'tail -v' из cygwin –

+0

@ Jon Я уже использую пакетный скрипт, который запускает rsync в другом CMD-окне, а выход rsync перенаправляется в txt-файл. В моем командном сценарии на следующей строке, которая запускает rsync, я хочу прочитать txt-файл и вычислить объем данных, которые были скопированы. Причина этого заключается в том, что у меня уже есть общий размер папки (около 4 ГБ), и я хочу записать на консольный вывод, сколько еще нужно скопировать дату. Является ли это возможным? –

ответ

1

Как dbenham сказал, это может быть сделано, но партия не первый выбор.
Внимание, образец будет работать в бесконечном цикле.
Вам необходимо добавить условие прерывания, в зависимости от содержимого файла.

добавить команду ping ..., чтобы избежать, что процесс потребляет 100% CPU времени

@echo off 
setlocal disabledelayedexpansion 
setlocal enableDelayedExpansion 
< rsyncOutput.tmp (
    call :readData 
) 
echo ready 
exit /b 

:readDataX 
set "line=" 
set /p line= 
if defined line (
    for /f "tokens=1,2 delims= " %%a in ("!line!") do (
    if "%%b"=="100%%" echo Bytes %%a 
) 
) 
ping localhost -n 2 > nul 
goto :readDataX 
exit /b 
1

Вот пример, который показывает, как читать файл, пока он записывается другим процессом. Это очень похоже на то, что показывает jeb, за исключением того, что я добавил общий тест, чтобы узнать, завершен ли процесс. Он предполагает, что процесс поддерживает блокировку файла в течение всего выполнения, а также предполагает, что 20 последовательных пустых строк указывают либо конец файла, либо мы ожидаем большего объема вывода из процесса. Порог 20 пустых строк может быть установлен на любое число, которое работает для вас.

Это решение может работать неправильно, если процесс записывает частичные строки в файл. Я считаю, что он надежный, если процесс всегда записывает каждую строку целиком за одну операцию. Кроме того, строки должны быть меньше или равны 1021 байтам, и они должны быть завершены возвратом каретки, переводом строки.

@echo off 
setlocal enableDelayedExpansion 
set "file=test.txt" 

set emptyCount=0 
del "%file% 

:: For this test, I will start an asynchronous process in a new window that 
:: writes a directory listing to an output file 3 times, with a 5 second pause 
:: between each listing. 
start "" cmd /c "(for /l %%N in (1 1 3) do @dir & ping localhost -n 6 >nul) >"%file%"" 

:wait for the output file to be created and locked 
if not exist "%file%" goto :wait 

:: Now read and process the file, as it is being written. 
call :read <"%file%" 
exit /b 

:read 
set "ln=" 
set /p "ln=" 
if defined ln (

    REM Process non-empty line here - test if correct line, extract size, and add 
    REM I will simply echo the line instead 
    echo(!ln! 

    REM Reset emptyCount for end of file test and read next line 
    set /a emptyCount=0 
    goto :read 

) else (REM End of file test 

    REM Count how many consecutive empty lines have been read. 
    set /a emptyCount+=1 

    REM Assume that 20 consecutive empty lines signifies either end of file 
    REM or else waiting for output. If haven't reached 20 consectutive 
    REM empty lines, then read next line. 
    if !emptyCount! lss 20 goto :read 

    REM Test if output file is still locked by attempting to redirect an unused 
    REM stream to the file in append mode. If the redirect fails, then the file 
    REM is still locked, meaning we are waiting for the process to finish and have 
    REM not reached the end. So wait 1 sec so as not to consume 100% of CPU, then 
    REM reset count and try to read the next line again. 
    REM If the file is not locked, then we are finished, so simply fall through 
    REM and exit. 
    (echo off 9>>"%file%")2>nul || (
    set emptyCount=0 
    ping localhost -n 2 >nul 
    goto :read 
) 
) 
exit /b