Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Отслеживание изменения конкретного файла по дате и времени (http://forum.oszone.net/showthread.php?t=349479)

zergnet 27-08-2021 15:14 2965144

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

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

megaloman 27-08-2021 18:10 2965166

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

zergnet 28-08-2021 19:56 2965222

Цитата:

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

Запускаться будет на сервере, там уже работают куча нефеншуйных программ) приходиться убивать их батником который процессы их убивает, иначе ничего в блокнот даже не написать))
время запуска в принципе можно использовать и 10 или 30 минут, это не очень критично.
Мой батник который счас работает убивает и перезапускает программу, походу тоже варварским способом через убиение процесса..

megaloman 29-08-2021 12:03 2965266

Вложений: 1
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 кодировке

zergnet 30-08-2021 11:45 2965327

очень извиняюсь, все еще разбираюсь только, немоглиб вы для моего понимания разъяснить что да как

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 2965351

я могу, остальное Вы прокомментировали правильно
Цитата:

Цитата 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

И, общее рассуждение, недоговоренность в постановке задачи обычно вылазит всем боком.

zergnet 30-08-2021 17:19 2965383

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

megaloman 30-08-2021 20:02 2965414

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 2965431

Цитата:

Цитата zergnet
программисты что писали эти программы их написали криво »

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

zergnet 31-08-2021 12:16 2965473

Цитата:

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

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

DJ Mogarych 31-08-2021 22:06 2965521

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

На пенсию, видать, лучше не рассчитывать.

zergnet 02-09-2021 11:35 2965650

Цитата:

Цитата DJ Mogarych
Да ладно. Собирается список косяков и отправляется вашему начальству, которое связывается с начальством программеров, а те их простимулируют. »

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

Iska 02-09-2021 22:08 2965703

Цитата:

Цитата zergnet
разработаны на фокс про »

Скупая мужская слеза стекла по щеке Штирлица… :).


Время: 23:43.

Время: 23:43.
© OSzone.net 2001-