Что нового

[Автоматизация] Мониторинг изменения файлов в папке и выполнения bat файла

atrade06

Новичок
Версия AutoIt: 3.3.14.0

Описание:
Необходимо контролировать папку на изменение и появление новых файлов раз в 60 секунд.
Задача следующая:
У меня запущена программа которая пишет логи в определенную папку, иногда программа зависает и логи перестают писаться,
задача скрипта отловить когда перестали писаться логи и запустить батник, который в свою очередь перезапустит программу.

Мне не важно сколько файлов было изменено в конкретной папке, если изменен хоть один файл значит программа работает и можно подождать еще 60 секунд.
Это я к тому что не надо перебирать все файлы а достаточно проверить и одного который по времени изменен последним.

Примечания:
Сколько по времени может отрабатывать данный скрипт если файлов в папке может лежать около 20000.
 
A

Alofa

Гость
Скрипт сравнивает размер папки и количество файлов в ней с предыдущими значениями, если данные сходны, то запускает dat.

Код:
Local $sDir = @ScriptDir & '\Logs' ; ................. Контролируемая папка
Local $sProgramm = 'MyPrigramm.exe' ; ................ Контролируемый процесс
Local $iPeriod = 60 * 1000 ; ......................... Частота проверки (в миллисекундах)
Local $sBatFile = @ScriptDir & '\RunProgramm.bat' ; ... BAT файл
Local $iDirSize, $iDirSizePrev, $iNumberFilesPrev, $iPID

If Not FileExists($sDir) Then Exit
AdlibRegister('_My_Func', $iPeriod)

$iPID = ProcessExists($sProgramm)
If Not $iPID Then $iPID = Run($sProgramm)
_My_Func()

While Sleep(200)
WEnd

Func _My_Func()
	$iDirSize = DirGetSize($sDir, 1)
	If ProcessExists($iPID) And $iDirSize <> -1 Then
		If $iDirSizePrev = $iDirSize[0] And $iNumberFilesPrev = $iDirSize[1] Then ; Если размер папки и количество файлов в ней сходны с предыдущими значениями, то...
			$iDirSizePrev = ''
			RunWait($sBatFile, '', @SW_HIDE) ; Запускаем .bat файл и ждем его завершения
			$iPID = ProcessWait($sProgramm, 5) ; Новый PID нового процесса
			If Not $iPID Then Return 0
		Else
			$iDirSizePrev = $iDirSize[0]
			$iNumberFilesPrev = $iDirSize[1]
		EndIf
	Else
		Exit
	EndIf
EndFunc   ;==>_My_Func



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

Уверен - все что делает .bat можно реализовать и в данном скрипте.
 

inververs

AutoIT Гуру
Код:
$dir = @DesktopDir & '\Logs'
$ONE_MINUTES = 1 * 60
While 1
	$changeTime = FileGetTime($dir, 0, 1)
	Sleep($ONE_MINUTES * 1000)
	If FileGetTime($dir, 0, 1) <> $changeTime Then ContinueLoop
	ShellExecuteWait('RunProgram.bat')
WEnd
 
Автор
A

atrade06

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