Показать полную графическую версию : Отслеживание изменения конкретного файла по дате и времени
Доброго времени, есть файл базы который периодически обновляется, но когда он обновился то программу нужно перезапустить, в данный момент у меня сделан батник который по циклу раз в час просто перезапускает программу, но хотелось бы что батник отслеживал изменения файла и перезапускал программу только если дата время у него изменилась.
в моем понимании:
- надо чтобы при первом запуске батник сделал текстовый файл (flag.txt) если нету, рядом с собой в который записал флаг времени, закрылся.
- потом при следующем запуске, сравнил флаг времени со временем в данный момент у файла базы, если такой же то просто закрылся, если изменен то внести новый флаг в flag.txt и запустить батник перезапуска программы, и закрывался.
этот батник будет запускаться через шедулер системы раз в 5 минут.
Или другой вариант без файла флага.
батник при запуске будет проверять если файл не изменялся более 5 минут то закрывается, если дата время изменения файла произошли менее 5 минут, то есть он изменился, то запускает батник перезугрузки программы, и закрывается.
сам не смог рабочий сделать, еще изучаю эти дела буду благодарен за помощь.
megaloman
27-08-2021, 18:10
zergnet, если этот батник будет запускаться через шедулер системы раз в 5 минут, то дергающийся экран не фэншуйно. Поэтому лучше использовать VBS-скрипт.FilePrg = "C:\Windows\System32\notepad.exe" 'Перезапускаемая программа
FileSee = "Z:\Soft_In\файл базы который периодически обновляется.dbf"
FileLog = "Z:\Soft_In\файл базы который периодически обновляется.dbf.log"
With CreateObject("Scripting.FileSystemObject")
Lfile = .FileExists(FileLog)
DateTimeSee = .GetFile(FileSee).DateLastModified
If Lfile Then
With .OpenTextFile(FileLog, 1)
DateFileOld = .ReadAll
.Close
End With
Lfile = CStr(DateTimeSee) = DateFileOld
End If
If Not Lfile Then
With .OpenTextFile(FileLog, 2, True)
.Write (DateTimeSee)
.Close
End With
SQuery = "Select *From Win32_Process Where Name=" + """" + .GetFileName(FilePrg) + """"
Do
Set Processes = GetObject("winMgmts:").ExecQuery(SQuery)
For Each Process In Processes
Process.Terminate
Next
' MsgBox "Processes.Count=" + CStr(Processes.Count)
Loop While Processes.Count > 0
Ret = CreateObject("WScript.Shell").Run("""" + FilePrg + """", 1, False)
End If
End Withzergnet, здесь программа убивается хамским образом. Сообщите, если есть легальный способ корректно завершить её выполнение.
zergnet, если этот батник будет запускаться через шедулер системы раз в 5 минут, то дергающийся экран не фэншуйно. Поэтому лучше использовать VBS-скрипт. »
Запускаться будет на сервере, там уже работают куча нефеншуйных программ) приходиться убивать их батником который процессы их убивает, иначе ничего в блокнот даже не написать))
время запуска в принципе можно использовать и 10 или 30 минут, это не очень критично.
Мой батник который счас работает убивает и перезапускает программу, походу тоже варварским способом через убиение процесса..
megaloman
29-08-2021, 12:03
zergnet, CMD@Echo Off
cls
Set "FilePrg=C:\Windows\System32\notepad.exe"
Set "FileSee=Z:\Soft_In\файл базы который периодически обновляется.dbf"
Set "FileLog=Z:\Soft_In\файл базы который периодически обновляется.dbf.log"
For %%e In ("%FilePrg%") Do Set "Exe=%%~nxe"
For %%t In ("%FileSee%") Do Set "DateTimeSee=%%~tt"
Set "DateFileOld="
If Exist "%FileLog%" Set /P DateFileOld=<"%FileLog%"
If "%DateTimeSee%"=="%DateFileOld%" Exit /B 0
:Begin
>nul 2>&1 (TaskList /Fi "ImageName Eq %Exe%" |Find /I "%Exe%" && (TASKKILL /IM "%Exe%" &GoTo :Begin))
>"%FileLog%" (Echo %DateTimeSee%)
Start " " "%FilePrg%"
Exit /B 0
Время отслеживается до минуты.
При наличии в путях кириллицы сохранить в 866 кодировке
очень извиняюсь, все еще разбираюсь только, немоглиб вы для моего понимания разъяснить что да как
Set "FilePrg=C:\Windows\System32\notepad.exe"
Set "FileSee=Z:\Soft_In\файл базы который периодически обновляется.dbf"
Set "FileLog=Z:\Soft_In\файл базы который периодически обновляется.dbf.log"
с этим все понятно это в переменные вставляются пути на программу, отслеживаемой базой, и лог с датой временем (флаг) для сравнения
For %%e In ("%FilePrg%") Do Set "Exe=%%~nxe" -это что за действие, проверка на запущенность программы?
For %%t In ("%FileSee%") Do Set "DateTimeSee=%%~tt" -это как я догадываюсь вытаскивание даты времени отслеживаемого файла
Set "DateFileOld="
If Exist "%FileLog%" Set /P DateFileOld=<"%FileLog%" - это как я понял если файл лог есть то в переменную DateFileOld помещается время из файла лога
If "%DateTimeSee%"=="%DateFileOld%" Exit /B 0 - тут происходит сравнение текущего времени и из переменной DateFileOld, если одинаково то просто закрывается.
:Begin
>nul 2>&1 (TaskList /Fi "ImageName Eq %Exe%" |Find /I "%Exe%" && (TASKKILL /IM "%Exe%" &GoTo :Begin)) -тут как я понял в общих чертах цикл по убиванию процесса, но структура команд не совсем понял
>"%FileLog%" (Echo %DateTimeSee%) -это как я понял помещение в файл лога нового времени
Start " " "%FilePrg%" - запуск программы с переменной FilePrg
Поправите меня если я неправильно понял,у меня батник который есть просто закрывает TASKKILL notepad , как я понял это не оптимально и процесс может иногда оставаться..
если делать перенаправление, чтобы не в этом батнике закрывалось а запускался другой батник который закрывает и запускает программу.
:Begin
>nul 2>&1 (TaskList /Fi "ImageName Eq %Exe%" |Find /I "%Exe%" && (TASKKILL /IM "%Exe%" &GoTo :Begin)) не нужно писать,
а после кода >"%FileLog%" (Echo %DateTimeSee%)
пишу вызов другого батника? например
call killer.bat
Exit /B 0
megaloman
30-08-2021, 13:35
For %%e In ("%FilePrg%") Do Set "Exe=%%~nxe" -это что за действие, проверка на запущенность программы? »Это способ из пути "FilePrg=C:\Windows\System32\notepad.exe" выделить имя Exe файла, которое я затем ищу в процессах.(TaskList /Fi "ImageName Eq %Exe%" |Find /I "%Exe%" »Анализирую, запущен ли процесс, имя которого я получил; если он успешно найден (&&), пытаюсь его убить пока он отображается. Возможно, неплохо бы перед &GoTo поставить несколько секунд ожидания (см. timeout /?), но тут уж надо более тонкое понимание Вашей задачи. Я пытаюсь гарантированно убить процесс и избежать в последующем наличие дубликата процесса. Возможно, это паранойя.а после кода >"%FileLog%" (Echo %DateTimeSee%)
пишу вызов другого батника? например
call killer.bat »Телепатнуть, что в том батнике, не берусь, поэтому его смысл в рамках заявленной Вами задачи для меня великая тайна. Но, ИМХО, даже если он Вам нужен, лучше его оформить в моём батнике процедурой, чтобы не плодить лишний батник и с ним поводы ошибиться в путях вызова. Например:
.......
.......
Call :killer "%FilePrg%"
.......
.......
Exit /B 0
:killer
Echo %1 %~nx1
.................
.................
Exit /B 0
И, общее рассуждение, недоговоренность в постановке задачи обычно вылазит всем боком.
Как я упоминал, у нас там есть батник который по шедулиру раз в час просто, убивал процессы программ и основного и связанных с этой программой модулей, потому просто рассматривал гипотетически передачу работы на другой батник который уже есть. В батнике killer.bat там прописаны таскилы процесса самой программы что с базой работает но и доп программ-модулей, и в том же батнике через timeout они последовательно стартуют. Я считаю что так очень топорно через час убивать все, и пытался найти более рациональное решение, что поделать что программисты что писали эти программы их написали криво...и вот скриптами -костылями мы это поправляем..
Но я с вами полностью согласен нафига плодить кучу батников.
Скрипт проверил уже на сервере, все работает.
Спасибо вам Большое, многое мне стало яснее.
megaloman
30-08-2021, 20:02
zergnet, @Echo Off
cls
Set "FileSee=Z:\Soft_In\файл базы который периодически обновляется.dbf"
Set "FileLog=Z:\Soft_In\файл базы который периодически обновляется.dbf.log"
Call :Analiz "%FileSee%" "%FileLog%" "DateTimeSee" &&Exit /B 0
Echo ................. "%DateTimeSee%"
Echo Текст Вашего киллера
Echo .................
>"%FileLog%" (Echo %DateTimeSee%)
Exit /B 0
:Analiz
SetLocal
Set "DateTimeSee=%~t1"
Set "DateFileOld="
If Exist %2 Set /P DateFileOld=<%2
If "%DateTimeSee%"=="%DateFileOld%" Exit /B 0
EndLocal &Set "%~3=%DateTimeSee%"
Exit /B 1
DJ Mogarych
30-08-2021, 21:16
программисты что писали эти программы их написали криво »
А наподдать программистам, чтобы они переписали свой г-код?
А наподдать программистам, чтобы они переписали свой г-код? »
ну мы админы в филиале, а эту программу писали люди которые в головном офисе, на них повлиять не можем..(
До того, да и счас многие специалисты по сообщениям с головного офиса, вручную перезагружают эти модули... ПФР россии))
DJ Mogarych
31-08-2021, 22:06
Да ладно. Собирается список косяков и отправляется вашему начальству, которое связывается с начальством программеров, а те их простимулируют.
На пенсию, видать, лучше не рассчитывать.
Да ладно. Собирается список косяков и отправляется вашему начальству, которое связывается с начальством программеров, а те их простимулируют. »
Это всем давно известно, как я работаю в пфр более 6 лет, и это да исх пор так. Программы разработаны на фокс про, товарищей которые знают его как я понял единицы, соответственно они боятся порушить что уже работает..
разработаны на фокс про »
Скупая мужская слеза стекла по щеке Штирлица… :).
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.