Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - Отслеживание изменения конкретного файла по дате и времени

Ответить
Настройки темы
CMD/BAT - Отслеживание изменения конкретного файла по дате и времени

Новый участник


Сообщения: 10
Благодарности: 0

Профиль | Отправить PM | Цитировать


Доброго времени, есть файл базы который периодически обновляется, но когда он обновился то программу нужно перезапустить, в данный момент у меня сделан батник который по циклу раз в час просто перезапускает программу, но хотелось бы что батник отслеживал изменения файла и перезапускал программу только если дата время у него изменилась.
в моем понимании:
- надо чтобы при первом запуске батник сделал текстовый файл (flag.txt) если нету, рядом с собой в который записал флаг времени, закрылся.
- потом при следующем запуске, сравнил флаг времени со временем в данный момент у файла базы, если такой же то просто закрылся, если изменен то внести новый флаг в flag.txt и запустить батник перезапуска программы, и закрывался.
этот батник будет запускаться через шедулер системы раз в 5 минут.

Или другой вариант без файла флага.
батник при запуске будет проверять если файл не изменялся более 5 минут то закрывается, если дата время изменения файла произошли менее 5 минут, то есть он изменился, то запускает батник перезугрузки программы, и закрывается.
сам не смог рабочий сделать, еще изучаю эти дела буду благодарен за помощь.

Отправлено: 15:14, 27-08-2021

 

Ветеран


Contributor


Сообщения: 2728
Благодарности: 1697

Профиль | Отправить PM | Цитировать


Вложения
Тип файла: txt я210827.vbs.txt
(1.2 Kb, 0 просмотров)

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
zergnet, здесь программа убивается хамским образом. Сообщите, если есть легальный способ корректно завершить её выполнение.

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Последний раз редактировалось megaloman, 28-08-2021 в 11:17.

Это сообщение посчитали полезным следующие участники:

Отправлено: 18:10, 27-08-2021 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Новый участник


Сообщения: 10
Благодарности: 0

Профиль | Отправить PM | Цитировать


Цитата megaloman:
zergnet, если этот батник будет запускаться через шедулер системы раз в 5 минут, то дергающийся экран не фэншуйно. Поэтому лучше использовать VBS-скрипт. »
Запускаться будет на сервере, там уже работают куча нефеншуйных программ) приходиться убивать их батником который процессы их убивает, иначе ничего в блокнот даже не написать))
время запуска в принципе можно использовать и 10 или 30 минут, это не очень критично.
Мой батник который счас работает убивает и перезапускает программу, походу тоже варварским способом через убиение процесса..

Отправлено: 19:56, 28-08-2021 | #3


Ветеран


Contributor


Сообщения: 2728
Благодарности: 1697

Профиль | Отправить PM | Цитировать


Вложения
Тип файла: txt я210829.bat.txt
(636 байт, 4 просмотров)

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
Благодарности: 0

Профиль | Отправить 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


Ветеран


Contributor


Сообщения: 2728
Благодарности: 1697

Профиль | Отправить PM | Цитировать


я могу, остальное Вы прокомментировали правильно
Цитата zergnet:
For %%e In ("%FilePrg%") Do Set "Exe=%%~nxe" -это что за действие, проверка на запущенность программы? »
Это способ из пути "FilePrg=C:\Windows\System32\notepad.exe" выделить имя Exe файла, которое я затем ищу в процессах.
Цитата zergnet:
(TaskList /Fi "ImageName Eq %Exe%" |Find /I "%Exe%" »
Анализирую, запущен ли процесс, имя которого я получил; если он успешно найден (&&), пытаюсь его убить пока он отображается. Возможно, неплохо бы перед &GoTo поставить несколько секунд ожидания (см. timeout /?), но тут уж надо более тонкое понимание Вашей задачи. Я пытаюсь гарантированно убить процесс и избежать в последующем наличие дубликата процесса. Возможно, это паранойя.
Цитата zergnet:
а после кода >"%FileLog%" (Echo %DateTimeSee%)
пишу вызов другого батника? например
call killer.bat »
Телепатнуть, что в том батнике, не берусь, поэтому его смысл в рамках заявленной Вами задачи для меня великая тайна. Но, ИМХО, даже если он Вам нужен, лучше его оформить в моём батнике процедурой, чтобы не плодить лишний батник и с ним поводы ошибиться в путях вызова. Например:
Код: Выделить весь код
 
     .......
     .......
     Call :killer  "%FilePrg%"
     .......
     .......
Exit /B 0

:killer 
     Echo %1  %~nx1
     .................
     .................
Exit /B 0
И, общее рассуждение, недоговоренность в постановке задачи обычно вылазит всем боком.

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.

Это сообщение посчитали полезным следующие участники:

Отправлено: 13:35, 30-08-2021 | #6


Новый участник


Сообщения: 10
Благодарности: 0

Профиль | Отправить PM | Цитировать


Как я упоминал, у нас там есть батник который по шедулиру раз в час просто, убивал процессы программ и основного и связанных с этой программой модулей, потому просто рассматривал гипотетически передачу работы на другой батник который уже есть. В батнике killer.bat там прописаны таскилы процесса самой программы что с базой работает но и доп программ-модулей, и в том же батнике через timeout они последовательно стартуют. Я считаю что так очень топорно через час убивать все, и пытался найти более рациональное решение, что поделать что программисты что писали эти программы их написали криво...и вот скриптами -костылями мы это поправляем..
Но я с вами полностью согласен нафига плодить кучу батников.
Скрипт проверил уже на сервере, все работает.
Спасибо вам Большое, многое мне стало яснее.

Отправлено: 17:19, 30-08-2021 | #7


Ветеран


Contributor


Сообщения: 2728
Благодарности: 1697

Профиль | Отправить 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


Аватара для DJ Mogarych

fascinating rhythm


Moderator


Сообщения: 6626
Благодарности: 1528

Профиль | Отправить PM | Цитировать


Цитата zergnet:
программисты что писали эти программы их написали криво »
А наподдать программистам, чтобы они переписали свой г-код?

-------
Powershell 7.x | Powershell 5.1 | ffmpeg (docs)

Это сообщение посчитали полезным следующие участники:

Отправлено: 21:16, 30-08-2021 | #9


Новый участник


Сообщения: 10
Благодарности: 0

Профиль | Отправить PM | Цитировать


Цитата DJ Mogarych:
А наподдать программистам, чтобы они переписали свой г-код? »
ну мы админы в филиале, а эту программу писали люди которые в головном офисе, на них повлиять не можем..(
До того, да и счас многие специалисты по сообщениям с головного офиса, вручную перезагружают эти модули... ПФР россии))

Отправлено: 12:16, 31-08-2021 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - Отслеживание изменения конкретного файла по дате и времени

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
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




 
Переход