|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - Отслеживание изменения конкретного файла по дате и времени |
|
|
CMD/BAT - Отслеживание изменения конкретного файла по дате и времени
|
Новый участник Сообщения: 10 |
Доброго времени, есть файл базы который периодически обновляется, но когда он обновился то программу нужно перезапустить, в данный момент у меня сделан батник который по циклу раз в час просто перезапускает программу, но хотелось бы что батник отслеживал изменения файла и перезапускал программу только если дата время у него изменилась.
в моем понимании: - надо чтобы при первом запуске батник сделал текстовый файл (flag.txt) если нету, рядом с собой в который записал флаг времени, закрылся. - потом при следующем запуске, сравнил флаг времени со временем в данный момент у файла базы, если такой же то просто закрылся, если изменен то внести новый флаг в flag.txt и запустить батник перезапуска программы, и закрывался. этот батник будет запускаться через шедулер системы раз в 5 минут. Или другой вариант без файла флага. батник при запуске будет проверять если файл не изменялся более 5 минут то закрывается, если дата время изменения файла произошли менее 5 минут, то есть он изменился, то запускает батник перезугрузки программы, и закрывается. сам не смог рабочий сделать, еще изучаю эти дела буду благодарен за помощь. |
|
Отправлено: 15:14, 27-08-2021 |
Ветеран Сообщения: 2728
|
Профиль | Отправить PM | Цитировать 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 With |
------- Последний раз редактировалось megaloman, 28-08-2021 в 11:17. Отправлено: 18:10, 27-08-2021 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Новый участник Сообщения: 10
|
Профиль | Отправить PM | Цитировать Цитата megaloman:
время запуска в принципе можно использовать и 10 или 30 минут, это не очень критично. Мой батник который счас работает убивает и перезапускает программу, походу тоже варварским способом через убиение процесса.. |
|
Отправлено: 19:56, 28-08-2021 | #3 |
Ветеран Сообщения: 2728
|
Профиль | Отправить PM | Цитировать 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 кодировке |
------- Отправлено: 12:03, 29-08-2021 | #4 |
Новый участник Сообщения: 10
|
Профиль | Отправить PM | Цитировать очень извиняюсь, все еще разбираюсь только, немоглиб вы для моего понимания разъяснить что да как
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 |
|
Отправлено: 11:45, 30-08-2021 | #5 |
Ветеран Сообщения: 2728
|
Профиль | Отправить PM | Цитировать я могу, остальное Вы прокомментировали правильно
Цитата zergnet:
Цитата zergnet:
Цитата zergnet:
|
|||
------- Отправлено: 13:35, 30-08-2021 | #6 |
Новый участник Сообщения: 10
|
Профиль | Отправить PM | Цитировать Как я упоминал, у нас там есть батник который по шедулиру раз в час просто, убивал процессы программ и основного и связанных с этой программой модулей, потому просто рассматривал гипотетически передачу работы на другой батник который уже есть. В батнике killer.bat там прописаны таскилы процесса самой программы что с базой работает но и доп программ-модулей, и в том же батнике через timeout они последовательно стартуют. Я считаю что так очень топорно через час убивать все, и пытался найти более рациональное решение, что поделать что программисты что писали эти программы их написали криво...и вот скриптами -костылями мы это поправляем..
Но я с вами полностью согласен нафига плодить кучу батников. Скрипт проверил уже на сервере, все работает. Спасибо вам Большое, многое мне стало яснее. |
Отправлено: 17:19, 30-08-2021 | #7 |
Ветеран Сообщения: 2728
|
Профиль | Отправить PM | Цитировать 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 |
------- Отправлено: 20:02, 30-08-2021 | #8 |
fascinating rhythm Сообщения: 6626
|
Профиль | Отправить PM | Цитировать Цитата zergnet:
|
|
------- Отправлено: 21:16, 30-08-2021 | #9 |
Новый участник Сообщения: 10
|
Профиль | Отправить PM | Цитировать Цитата DJ Mogarych:
До того, да и счас многие специалисты по сообщениям с головного офиса, вручную перезагружают эти модули... ПФР россии)) |
|
Отправлено: 12:16, 31-08-2021 | #10 |
|
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
CMD/BAT - Архивирование файлов по дате изменения | GODolubOFF | Скриптовые языки администрирования Windows | 7 | 15-04-2015 20:22 | |
Log/Monitoring - Отслеживание трафика конкретного пользователя | GuitarFan | Сетевые технологии | 13 | 20-10-2013 01:18 | |
VBS/WSH/JS - Отправка по почте последнего файла .log, созданного по дате и времени | alex_frog | Скриптовые языки администрирования Windows | 0 | 03-02-2013 17:32 | |
CMD/BAT - Как написать CMD скрипт для запуска определенного файла по дате и времени | traxomot | Скриптовые языки администрирования Windows | 1 | 15-12-2010 11:50 | |
VBS/WSH/JS - [решено] Скрипт обновления файла с проверкой по дате изменения. | CtrlD | Скриптовые языки администрирования Windows | 2 | 17-07-2010 10:45 |
|