Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Программы » Ищется программа для отслеживания изменений в каталогах

Модерирует : gyra, Maz

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2

Открыть новую тему     Написать ответ в эту тему

zh76internetru

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
А мне нужна под винду такая....
В общем в нескольких папках постоянно пополняются текстовые файлы. Как логи.
Их размер естественно увеличивается.
Нужна такая, чтобы при достижении файла скажем 500 мб его переименовывала.
Пример: постоянно пишется в файл 1.тхт
Размер стал 500 Мб
Переименовало например в 11.тхт
Следующий в 12.тхт... и т.д.
А 1.тхт создается автоматически тем, чем в него пишется.
Но есть нюанс: нужа не строго чтоб по 500 мб рубила, а давала дописать строку лога.  
А то могут не все символы записаться и будет кусками. Некритично, второй кусок я в след. файле найду. Но нежелательно так.
 
Второй вариант - вместо слежки по объему можно по таймеру тоже самое.  
Я могу засечь сколько по времени пишется 500 метров файла. +\- 50 Мб не страшно.

Всего записей: 29 | Зарегистр. 24-09-2021 | Отправлено: 19:03 24-09-2021 | Исправлено: zh76internetru, 22:50 24-09-2021
BorlandIMHO

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
zh76internetru
Не учитывая нюанса:
renamer.cmd
Код:
@echo OFF
setlocal EnableDelayedExpansion
REM Имя файла для отслеживания размера
set "LOGFILE=x:\path to\logfile.txt"
REM Размер, при превышении которого файл нужно переименовать
set /A SIZELIMIT=524288000
 
for %%F in ("%LOGFILE%") do if %%~zF GTR %SIZELIMIT% (
    call :GETUTCTIMESTAMP TIMESTAMP
    ren "%LOGFILE%" "logfile_!TIMESTAMP!.txt"
)
goto :EOF
 
:GETUTCTIMESTAMP
for /f "usebackq tokens=1,2 delims==" %%A in (`wmic path Win32_UTCTime get year^,month^,day^,hour^,minute^,second /value ^| find "="`) do (
    set /a TMPVAL=%%B  
    if !TMPVAL! LSS 10 (
        set UTC_%%A=0%%B
    ) else (
        set UTC_%%A=%%B
    )
)
set %1=%UTC_Year%%UTC_Month%%UTC_Day%_%UTC_Hour%%UTC_Minute%%UTC_Second%
goto :EOF

При переименовании вместо сплошной нумерации удобнее, ИМХО, добавлять таймштамп, а не ничего никому не говорящий порядковый номер, что и реализовано у меня.
Скрипт добавить в таск шедулер на запуск с любой потребной частотой. Хоть каждую минуту, хоть раз в год.
 
Касательно нюанса: вероятность повреждения строки при построчной записи в файл близка к нулю, хотя тут, конечно, всё зависит от программы, пишущей лог...

----------
http://www.imho.ws

Всего записей: 3099 | Зарегистр. 12-10-2006 | Отправлено: 21:53 24-09-2021 | Исправлено: BorlandIMHO, 23:33 24-09-2021
zh76internetru

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
.

Всего записей: 29 | Зарегистр. 24-09-2021 | Отправлено: 23:18 24-09-2021 | Исправлено: zh76internetru, 23:44 24-09-2021
BorlandIMHO

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
zh76internetru
Мой косяк.
Проверял работу команды в комстроке, не добавил %. Д.б. не "%~zF", а "%%~zF".
Заодно и "delims=" там не пришей рукав.
Исправил, протестировал работу скрипта целиком.
 
Да, если что: время в таймштампе - UTC ("по Гринвичу"). Т.е. не зависящее от часового пояса.
Если хотите время локального компа - замените "Win32_UTCTime" на "Win32_CurrentTime".

----------
http://www.imho.ws

Всего записей: 3099 | Зарегистр. 12-10-2006 | Отправлено: 23:40 24-09-2021
zh76internetru

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Спасибо. Работает. Но не всегда.
Так как в файл постоянно пишет вывело:
E:\123>renamer.cmd
Процесс не может получить доступ к файлу, так как этот файл занят другим процессом.
 
Попробовал "наживую" запустить еще раз - сработал )))
 
E:\123>renamer.cmd
 
Видимо случайно попал между записями в файл.
 
======
 
З.Ы. Я в смд 3 раза продублировал весь код, чтоб наверняка "добивал".
Подчистил меж дублями goto :EOF, оставив лишь в конце.
Несколько раз позапускал - 100% попадание ))) 2 из 3 мимо, на запись попадает. 3-ий в яблочко.
И создается 1 доименнованный файл-бэкап.
Теперь вроде то что нужно.
 
Спасибо огромное за помощь )))  
 

Всего записей: 29 | Зарегистр. 24-09-2021 | Отправлено: 23:58 24-09-2021 | Исправлено: zh76internetru, 00:24 25-09-2021
zh76internetru

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Моя мысль пошла дальше.  
Планировщик задач это конечно хорошо, но у меня куча папок для создании "логов".
И под каждую там планировать не очень удобно.
Решил попробовать такое:
:loop
timeout /t 60
код
goto loop
 
При запуске таймер отсчитывает, сам код норм срабатывает, возвращаясь к таймеру.
Таймер снова отсчитывает и... renamer.cmd выключается.  
Как я понял - причина в новом созданном файле, который пока еще не дорос до нужного размера и стало быть скрипту делать нечего, уходит отдыхать.
Если переименованный файл (больше указанного размера) переименовать как был, все работает четко по его размеру.
 
Запустить бы процесс постоянной проверки.  
Маленький - ок, снова таймер тикает. Большой - ок, переименуем и будем периодически наблюдать.

Всего записей: 29 | Зарегистр. 24-09-2021 | Отправлено: 07:54 25-09-2021
BorlandIMHO

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
zh76internetru
Если вас  устраивает постоянно висящий в памяти процесс и "чёрное окошко" - не вопрос...

Цитата:
у меня куча папок для создании "логов"

Под каждый отслеживаемый файл создать свою переменную: LOGFILE1-LOGFILE100 и свой блок for по образу и подобию. Где-то так:
renamer2.cmd

Код:
@echo OFF
setlocal EnableDelayedExpansion
REM Имя файла для отслеживания размера
set "LOGFILE1=x:\path to\log1.txt"
REM Размер, при превышении которого файл нужно переименовать
set /A SIZELIMIT2=524288000
 
set "LOGFILE2=y:\path to\log2.txt"
set /A SIZELIMIT2=524288000
 
:LOOP
for %%F in ("%LOGFILE1%") do if %%~zF GTR %SIZELIMIT1% call :RENAME_IT "%%~fF"
for %%F in ("%LOGFILE2%") do if %%~zF GTR %SIZELIMIT2% call :RENAME_IT "%%~fF"
timeout /T 60
goto :LOOP
 
:RENAME_IT
call :GETUTCTIMESTAMP TIMESTAMP
ren "%~f1" "%~dpn1_!TIMESTAMP!.txt"
goto :EOF
 
:GETUTCTIMESTAMP
for /f "usebackq tokens=1,2 delims==" %%A in (`wmic path Win32_UTCTime get year^,month^,day^,hour^,minute^,second /value ^| find "="`) do (
    set /a TMPVAL=%%B  
    if !TMPVAL! LSS 10 (
        set UTC_%%A=0%%B
    ) else (
        set UTC_%%A=%%B
    )
)
set %1=%UTC_Year%%UTC_Month%%UTC_Day%_%UTC_Hour%%UTC_Minute%%UTC_Second%
goto :EOF
Проверка раз в минуту, если "файл занят другим процессом" - следующая попытка ещё через минуту. В конце концов попадёт на незанятый файл...
Запускать руками или ставить в автозапуск.
Можно, в принципе, не морочиться с переменными, а указывать вместо %LOGFILEn% имя файла, а вместо %SIZELIMITn% предельный размер.


----------
http://www.imho.ws

Всего записей: 3099 | Зарегистр. 12-10-2006 | Отправлено: 08:54 25-09-2021 | Исправлено: BorlandIMHO, 09:13 25-09-2021
zh76internetru

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Подробнее...

Всего записей: 29 | Зарегистр. 24-09-2021 | Отправлено: 10:00 25-09-2021
BorlandIMHO

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
zh76internetru
Дело, конечно, ваше - но мне, к примеру, проще с одним файлом. А чтобы не было проблем при перемещении папок и прочих изменениях - можно "заставить скрипт переобуваться на лету".
Подробнее...

----------
http://www.imho.ws

Всего записей: 3099 | Зарегистр. 12-10-2006 | Отправлено: 11:45 25-09-2021 | Исправлено: BorlandIMHO, 11:50 25-09-2021
harrykkk



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
GCRaistlin

Цитата:
nnCron - совершенно незаменимая вещь

12 Dec 2008. На win10 работает?

Всего записей: 9020 | Зарегистр. 24-02-2013 | Отправлено: 16:36 25-09-2021
persicum

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Есть еще простенькая консольная прога-ревизор RSC32. Понятно, что кроме автора её никто юзать не будет, и она без Юникода... Но она может запомнить blake2sp-128 в бинарный файл, а потом сравнить.
 
Запомнили:
rsc32 -wt -r    
 
Сравнили:
rsc32 -rt  
 
В файл:
rsc32 -rt -lo

Всего записей: 639 | Зарегистр. 27-06-2007 | Отправлено: 18:02 25-09-2021
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2

Компьютерный форум Ru.Board » Компьютеры » Программы » Ищется программа для отслеживания изменений в каталогах


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2025

LiteCoin: LgY72v35StJhV2xbt8CpxbQ9gFY6jwZ67r

Рейтинг.ru