Что нового

[Автоматизация] Проверка зависания программы+как узнать имя файла,если оно меняется каждый день.

yaodnako

Продвинутый
Сообщения
120
Репутация
78
Есть такая программа как ClubControl и она периодически зависает.Решил написать скрипт для распознавания зависания этой проги и последующего ее перезапуска.Нашел файл,к которому прога часто обращается при активной работе и увеличивает постоянно его размер,соответственно при зависании файл остается неизменным и проверку можно устроить просто по размеру.Но тут есть одна трудность - это файл каждый день меняется и имеет формат "ГГ ММ ДД.cc4.bak".то есть часть имени состоит из текущей даты,но сложность в том,что эта дата меняется не в 12 часов ночи,а в 8 утра.Пришлось делать условие и если еще не наступило 8 утра и время больше 12ти ночи - просто от дня отнимается единица.И в итоге(см.скрипт) все вроде нормально,но прога 1го числа любого месяца после 12ти и до 8ми утра работать правильно не будет!
1.как сделать так,чтобы она правильно определяла число предидущего дня?ведь есть и 30 и 31 и 28 последние числа месяца,+високосный невисокосный год!
2.как скрыть иконку выполнения скрипта в трее.
3.Пробовал сделать вначале проверку по номеру порта и айпи - не знаю почему не получилось,пришлось так изголяться.как можно реализовать это?может можно еще как то определить,что программа зависла?
4.может можно как то по другому узнать имя этого файла? по времени изменения не получится,так как там еще есть файл,который так же часто изменяется.
да и еще - как сделать,чтобы на форуме изображение кода было с цветными пометками? пробовал утилиту для вставки в форум - почему то отобразились только теги!в итоге это нечитабельно стало.пришлось так вставлять код.
сильно не пинайте - я только позавчера познакомился с автоитом и это мой первый серьезный(для меня:smile:) скрипт :smile:



Код:
;================ Функция проверки времени+генерация имени файла бэкапа отчета ================
Func VerifyTime()
dim $hh=@hour & @min
if $hh>=800 and $hh<=2359 then
Local $currentDateFilename=@YEAR & " " & @MON & " " & @MDAY & ".cc4.bak"
;для теста MsgBox(0,"Имя файла не меняется",$currentDateFilename)
else
dim $day=@mday-1
Local $currentDateFilename=@YEAR & " " & @MON & " " & $day & ".cc4.bak"
;для теста MsgBox(0,"Имя файла меняется",$currentDateFilename)
Endif
return $currentDateFilename
EndFunc
;==================================================================================

Do
$tmp=1

dim $filepath="F:\CCC Data\Data\" & verifyTime()
;складываем путь и переменную,где хранится имя файла.
;и сохраяем это в новую переменную.
;msgBox(0,"путь = ", $filepath)
dim $size1= FileGetSize($filepath)
;MsgBox(0,"Размер файла равен", $size1)
Sleep(180000)
dim $size2=FileGetSize($filepath)
If $size1=$size2 Then
ProcessClose("ClubControl.exe")
Run ("C:\ClubControl\ClubControl.exe")
WinWaitActive("Вход в систему")
Send("{ENTER}")
EndIf
until $tmp=0
 

Yuri

AutoIT Гуру
Сообщения
737
Репутация
282
Re: [Автоматизация] Проверка зависания программы+как узнать имя файла,если оно меняется каждый день

А если по такому принципу:
Получать самый свежий *.bak
(время его создания/модификации)

Небольшой скрипт для наглядности.
Возможно не очень оптимизированный.

Код:
#Include <File.au3>
#Include <Array.au3>
$FileList=_FileListToArray("D:\Test\") ; сформировать список файлов
If (Not IsArray($FileList)) and (@Error=1) Then
    MsgBox (16,"Ошибка","Нет файлов")
    Exit
EndIf

_ArrayDisplay($FileList,"Имена наших файлов") ; показать

MsgBox (64,"В массиве",$FileList[0] & " имен файлов") ; вывести сколько имен файлов в массиве
$n = $FileList[0]
Dim $avArray[1]

For $i = 1 To $FileList[0]
	$ttt = FileGetTime("D:\Test\" & $FileList[$i], 1) ; получить дату файла
	$yyyymd = $ttt[0] & "/" & $ttt[1] & "/" & $ttt[2] & "/" & $ttt[3] & "/" & $ttt[4] & "/" & $ttt[5] ; сформировать дату из всех параметров
	;MsgBox(64, "Файл", $yyyymd & " => " & "D:\Test\" & $FileList[$i])
	_ArrayInsert( $avArray,$i,$yyyymd & " D:\Test\" & $FileList[$i]) ; массив с датой файлов (вначале дата для дальнейшей сортировки)
Next


_ArrayDisplay( $avArray, "Наши файлы с датой" ) ; показать

_ArraySort( $avArray) ; отсортировать по возрастанию

$myFile = _ArrayDisplay( $avArray, "Наши файлы, отсортированные по дате" ) ; показать
MsgBox(64, "Самый свежий файл", $avArray[$n])
 
Автор
yaodnako

yaodnako

Продвинутый
Сообщения
120
Репутация
78
Re: [Автоматизация] Проверка зависания программы+как узнать имя файла,если оно меняется каждый день

Огромное Спасибо Yuri! Попробую... Не все ясно в скрипте(еще мало знаю команд) - буду ковырять...
я тоже думал о возможности найти Bak файл с последней датой,но реализовать не знал как.

1.Может как то еще можно определить,что программа зависла?
2.как сделать,чтобы на форуме изображение кода было с цветными пометками? пробовал утилиту для вставки в форум Au3ToPst - код вставился вместе с тегами т.е. теги не действовали,а были видны вместе с кодом при вставке в форум!в итоге это нечитабельно стало.может что то дописывать надо к переведенному в утилите коду?


:IL_AutoIt_1:
 

Yuri

AutoIT Гуру
Сообщения
737
Репутация
282
Re: [Автоматизация] Проверка зависания программы+как узнать имя файла,если оно меняется каждый день

2.как сделать,чтобы на форуме изображение кода было с цветными пометками?
Когда вопрос или ответ формируешь, - тег используй
autoit /autoit

(Третий: Цитата - Код - AutoIt tag)

autoit Твой код autoit

Не люблю я эти теги.
Лучше пусть модератор или админ объяснит.
В мое первом вопросе, был точно такой же подвовпрос про подсветку:smile:
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
Re: [Автоматизация] Проверка зависания программы+как узнать имя файла,если оно меняется каждый день

используйте кнопку
autoit.gif
после того как выделите сообщение
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Re: [Автоматизация] Проверка зависания программы+как узнать имя файла,если оно меняется каждый день

yaodnako [?]
пробовал утилиту для вставки в форум Au3ToPst - код вставился вместе с тегами т.е. теги не действовали,а были видны вместе с кодом при вставке в форум!в итоге это нечитабельно стало.может что то дописывать надо к переведенному в утилите коду?
Нужно обрамляющие теги code заменить на autoit_code (этот тег только здесь работает), теги внутри тега code не обрабатываются.


Yuri [?]
Лучше пусть модератор или админ объяснит
А что объяснять, вводите код, выделяете его, и нажимаете соответствующую кнопку на панели (чёрная иконка AutoIt, с подсказкой «AutoIt tag» :smile:) - ну или наоборот, сначала кнопка а потом вставка кода.
 
Автор
yaodnako

yaodnako

Продвинутый
Сообщения
120
Репутация
78
Re: [Автоматизация] Проверка зависания программы+как узнать имя файла,если оно меняется каждый день

Всем огромное спасибо :smile:Yuri - я сразу понял,что ты имел ввиду.разобрался как делать цветным.

И еще вопрос -в качестве временного решения - я решил сделать так,чтобы прога в режиме ожидания находилась с 12ти ночи до 8ми утра 1го числа.Затем она продолжает работать(так как именно в этот промежуток она будет работать неправильно).Попытался работать с циклами,чего то не получается - как делать цикл внутри цикла?или сделать функцию в которой все идет по кругу,пока не выполнится условие. сделал вот таким образом,но не работает - в чем ошибка?или может проще можно это сделать - кажется это очень мудрено получилось.

Код:
If @mday=1 and @hour<8 Then check()
EndIf

Func check()
While @hour<8
MsgBox(0,"День 1го числа","прогонка:)",2) Until @hour>8
WEnd
Return
EndFunc


p.s. CreatoR'у тоже спасибо - разобрался.если убрать тег code то все работает.для поста на другой форум сойдет :smile:
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Re: [Автоматизация] Проверка зависания программы+как узнать имя файла,если оно меняется каждый день

yaodnako
Попробуйте так:
Код:
If @MDAY = 1 And @HOUR < 8 Then
	_Check()
EndIf

Func _Check()
	Do
		ToolTip("День 1го числа. Прогонка...",0,0)
	Until @HOUR = 8
EndFunc
 

Yuri

AutoIT Гуру
Сообщения
737
Репутация
282
Re: [Автоматизация] Проверка зависания программы+как узнать имя файла,если оно меняется каждый день

Чисто на-вскидку. Не проверял.
Код:
If @mday=1 and @hour<8 Then 
	Call check()
Else
	Call check_error()
EndIf

Func check()
MsgBox(64,"День 1го числа","прогонка:)","hour<8" & " и " & " mday=1")
EndFunc

Func check_error()
MsgBox(16,"Ошибка","Непредвиденная")
EndFunc
 
Автор
yaodnako

yaodnako

Продвинутый
Сообщения
120
Репутация
78
Re: [Автоматизация] Проверка зависания программы+как узнать имя файла,если оно меняется каждый день

To Garret:
Очень помог! Респект тебе :beer: ! твой кусочек кода дал мне много опыта :smile:Разобрался в некоторых ранее непонятных мне вопросах(которые еще не успел задать:smile:).



Ващее класный кусочек скрипта :smile:
аж мотивация копать поглубже автоит усилилась!!!!

To Yuri:
Тебе тоже респект за помощь.Твой вариант тоже взял на заметку:smile: Еще медитирую на твой первый скрипт :smile:

Всем кто помогает в этом нелегком деле респект за то что вы есть и усиливаете интерес бьющимся лбами об autoit новичкам :beer: :beer: :beer: :IL_AutoIt_1:

А можно ли просто тупо поставить условие - wait пока скажем @hour>8 ? это будет в 100 раз проще.а потом просто продолжить скрипт.
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Re: [Автоматизация] Проверка зависания программы+как узнать имя файла,если оно меняется каждый день

yaodnako
Всегда рад помочь!

yaodnako [?]
А можно ли просто тупо поставить условие - wait пока скажем @hour>8 ?
Можно
Код:
While @MDAY = 1 And @HOUR < 8
	ToolTip("День 1го числа. Прогонка...",0,0)
WEnd
 
Автор
yaodnako

yaodnako

Продвинутый
Сообщения
120
Репутация
78
Re: [Автоматизация] Проверка зависания программы+как узнать имя файла,если оно меняется каждый день

To Yuri:
Твой скрипт выдает ошибку - D:\Autoit\proekts\poisk bak faila yuri.au3 (17) : ==> Subscript used with non-Array variable.:
$yyyymd = $ttt[0] & "/" & $ttt[1] & "/" & $ttt[2] & "/" & $ttt[3] & "/" & $ttt[4] & "/" & $ttt[5]
$yyyymd = $ttt^ ERROR
->08:36:21 AutoIT3.exe ended.rc:1

Просмотрел его и частично разобрался.он должен выдавать файл с самой последней модификацией.Ок.но видишь в чем загвоздка.там есть два(или три) файла к которым программа постоянно обращается и постоянно их изменяет - мне нужен только файл с расширением BAK.
Как это реализовать? Я тут попробовал сам кое-что - получилось вот как

Код:
$search = FileFindFirstFile("d:\ClubControl\DAta\*.bak");ищем первый файл bak

While 1
    $file = FileFindNextFile($search)
    If @error Then ExitLoop

    ;MsgBox(4096, "File:", $file)
	$t =  FileGetTime("d:\ClubControl\DAta\" & $file);получаем его дату
	$yyyymd = $t[0] & "/" & $t[1] & "/" & $t[2]
    ;MsgBox(0, "Дата создания файла", $yyyymd)
FileClose($search)
WEnd

MsgBox(4096,"Резюме","Последний файл был - " & $file & "Его дата создания - " & $yyyymd)


Но проблема в том,что он почему то не запоминает последний файл в переменную $file.А вот дату последнего файла переменная $yyyymd помнит.может можно на основании последней даты как то найти Bak файл последний.Помогите! Застрял :smile:
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Re: [Автоматизация] Проверка зависания программы+как узнать имя файла,если оно меняется каждый день

yaodnako
А если так попробовать:
Код:
$search = FileFindFirstFile("d:\ClubControl\DAta\*.bak")
If $search <> -1 Then
	$file = FileFindNextFile($search)
	$t = FileGetTime("d:\ClubControl\DAta\" & $file)
	$yyyymd = $t[0] & "/" & $t[1] & "/" & $t[2]
	FileClose($search)
Else
	FileClose($search)
	MsgBox(0, "", "Нет файла")
	Exit
EndIf
MsgBox(4096, "Резюме", "Последний файл был - " & $file & "Его дата создания - " & $yyyymd)
 
Автор
yaodnako

yaodnako

Продвинутый
Сообщения
120
Репутация
78
Re: [Автоматизация] Проверка зависания программы+как узнать имя файла,если оно меняется каждый день

To madmasles:
Попробовал :smile: Он выдает первый найденный файл,а не последний.


Добавлено:
Сообщение автоматически объединено:

а может можно сделать так?
каждый найденный bak файл заливать в переменную или в массив и затем вытащить последнее значение из массива? Пока не умею работать с массивами - намекните если так можно и направление мыслей ? :smile:
я так понял,что в моем случае не обязательно даже искать время изменения файла,ведь файлы отчетов генерируются последовательно.

Это упрощает задачу наверно,но мне ,конечно, интересно узнать и как можно с проверкой даты изменений все сделать? :beer: :whistle: :whistle:
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Re: [Автоматизация] Проверка зависания программы+как узнать имя файла,если оно меняется каждый день

yaodnako
А так:
Код:
#include <File.au3>
#include <Array.au3>

$sFolder = "d:\ClubControl\DAta"
$FileList = _FileListToArray($sFolder, "*.*.bak", 1)
For $i = 1 To UBound($FileList) - 1
	$sTime = FileGetTime($sFolder & "\" & $FileList[$i], 1, 1)
	$FileList[$i] = $sTime & "|" & $FileList[$i]
Next
_ArraySort($FileList, 0, 1)
_ArrayDisplay($FileList)
MsgBox(0, "", $sFolder & "\" & StringTrimLeft($FileList[$FileList[0]], StringInStr($FileList[$FileList[0]], "|")))
 
Автор
yaodnako

yaodnako

Продвинутый
Сообщения
120
Репутация
78
Re: [Автоматизация] Проверка зависания программы+как узнать имя файла,если оно меняется каждый день

Работает круто :smile: Вот только я залип :shok: и не знаю как теперь вставить в итоге полученный файлик в простую переменную чтобы с ним работать дальше :smile:)) Такой маааленький получился - круть...
Спасиб :beer:

------------------------------
Все нашел :smile:
Код:
$v=StringTrimLeft($FileList[$FileList[0]], StringInStr($FileList[$FileList[0]], "|"))


правда я вообще не понимаю что означает каждая функция после знака "=" :smile:)) Буду разбираться.
Огромное спасибо Madmasles и всем помогающим!

А еще вопросик - он 1.6 секунды(без диалогов) выполняется потому что обращается к другим файлам (include которые)? Можно ли как-то уменьшить это время(это не критично в моем случае,но все равно интересно)?


Добавлено:
Сообщение автоматически объединено:

Все протестил скрипт - работает отлично. :ok:
Вот что получилось в итоге :

Код:
#NoTrayIcon
#include <File.au3>
#include <Array.au3>

Do
$sFolder = "d:\ClubControl\DAta"
$FileList = _FileListToArray($sFolder, "*.bak", 1)
For $i = 1 To UBound($FileList) - 1
    $sTime = FileGetTime($sFolder & "\" & $FileList[$i], 1, 1)
    $FileList[$i] = $sTime & "|" & $FileList[$i]
Next
_ArraySort($FileList, 0, 1)

$FullPath = $sFolder & "\" & StringTrimLeft($FileList[$FileList[0]], StringInStr($FileList[$FileList[0]], "|"))

$tmp=1

dim $size1= FileGetSize($FullPath)
Sleep(30000)
dim $size2 = FileGetSize($FullPath)
If $size1 = $size2 Then
ProcessClose("ClubControlHome.exe")
Run ("D:\ClubControl\ClubControlHome.exe")
WinWaitActive("Вход в систему")
Send("{ENTER}")
EndIf
until $tmp=0


Тема решена! Всем ОГРОМНОЕ спасибо! :IL_AutoIt_1: :IL_AutoIt_1: :IL_AutoIt_1:
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Re: [Автоматизация] Проверка зависания программы+как узнать имя файла,если оно меняется каждый день

yaodnako [?]
правда я вообще не понимаю что означает каждая функция после знака "="
В русской справке про эти функции почитать можно.

PS
А лучше в английской.
 
Верх