Что нового

[Автоматизация] Модуль автообновления (проблемы с постоянной скачкой)

warezoogle3

Новичок
Сообщения
73
Репутация
1
Хотел бы поделится модулем автообновления со сообществом. Может кому-то будет нужно.
И заодно появились некоторые проблемы и вопросы.
Вот код с комментариями.
Код:
#include <Crypt.au3>
#include <WinAPIEx.au3>
#NoTrayIcon
#RequireAdmin
#region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Icon=E:\SuperIcon.ico
#AutoIt3Wrapper_Compression=4
#endregion ;**** Directives created by AutoIt3Wrapper_GUI ****

FileInstall("7za.exe", "C:\7za.exe", 1) ;Подготавливаем распаковщик 7-zip 

Local $nSize = InetGetSize("http://192.168.10.212/md5new.txt", 1) ;Запрашиваем размер произвольного файла со сервера

If $nSize <> 0 Then ;Если размер не равен нулю,то связь есть,можно продолжать

	$md5oldraw = _Crypt_HashFile("Program1.exe", $CALG_MD5) ;Рассчитываем хеш md5 1-ой программы (со символами 0x в начале)
	$md5old = StringTrimLeft($md5oldraw, 2) ;Удаляем первые два символа хеша (0x)

	InetGet("http://192.168.10.212/md5new.txt", "C:\md5new.txt", 0) ;Скачиваем 1-ый текстовой файл с хешом новый версии 1-ой программы
	$md5newopen = FileOpen("C:\md5new.txt") ;Открываем
	$md5new = FileRead($md5newopen, 32) ;Считываем
	FileClose($md5newopen);Закрываем

	If $md5new <> $md5old Then ;Если хеши не совпадают,то
		ProgressOn('Updating Program1', 'Updating Program1', '0 %', 50, 50, 16) ;Скачиваем архив с новой версией 1-ой программы и одновремменно показываем ProgressBar
		$hDownload = InetGet('http://192.168.10.212/Program1.7z', 'C:\Program1.7z', 1, 1)
		Do
			If InetGetInfo($hDownload, 1) Then
				$iPersent = Round((InetGetInfo($hDownload, 0) / InetGetInfo($hDownload, 1)) * 100)
				ProgressSet($iPersent, $iPersent & ' %, ' & _WinAPI_StrFormatByteSize(InetGetInfo($hDownload, 0)) & _
						' (' & _WinAPI_StrFormatByteSize(InetGetInfo($hDownload, 1)) & ')')
			EndIf
			Sleep(500)
		Until InetGetInfo($hDownload, 2)
		InetClose($hDownload)
		ProgressOff()

		RunWait('C:\7za.exe x -o"' & "C:\" & '" -y ' & "C:\Program1.7z") ;Разархивировываем
		FileCopy("C:\Program1.exe", "Program1.exe", 1) ;Перезаписываем

		FileDelete("C:\md5new.txt") ;Удаляем временные файлы
		FileDelete("C:\Program1.7z")
		FileDelete("C:\Program1.exe")

	EndIf

	If FileExists("Program2.exe") Then ;Если 2-ая программа присутствует,то

		$LPSmd5oldraw = _Crypt_HashFile("Program2.exe", $CALG_MD5) ;Рассчитываем хеш md5 2-ой программы (со символами 0x в начале)
		$LPSmd5old = StringTrimLeft($LPSmd5oldraw, 2) ;Удаляем первые два символа хеша (0x)
		InetGet("http://192.168.10.212/LPSmd5new.txt", "C:\LPSmd5new.txt", 0) ;Скачиваем 2-ой текстовой файл с хешом новый версии 2-ой программы
		$LPSmd5newopen = FileOpen("C:\LPSmd5new.txt") ;Открываем
		$LPSmd5new = FileRead($LPSmd5newopen, 32)  ;Считываем
		FileClose($LPSmd5newopen) ;Закрываем

		If $LPSmd5new <> $LPSmd5old Then ;Если хеши не совпадают,то
			ProgressOn('Updating Program2', 'Updating Program2', '0 %', 50, 50, 16) ;Скачиваем архив с новой версией 2-ой программы и одновремменно показываем ProgressBar
			$hDownload2 = InetGet('http://192.168.10.212/Program2.7z', 'C:\Program2.7z', 1, 1)
			Do
				If InetGetInfo($hDownload2, 1) Then
					$iPersent2 = Round((InetGetInfo($hDownload2, 0) / InetGetInfo($hDownload2, 1)) * 100)
					ProgressSet($iPersent2, $iPersent2 & ' %, ' & _WinAPI_StrFormatByteSize(InetGetInfo($hDownload2, 0)) & _
							' (' & _WinAPI_StrFormatByteSize(InetGetInfo($hDownload2, 1)) & ')')
				EndIf
				Sleep(500)
			Until InetGetInfo($hDownload2, 2)
			InetClose($hDownload2)
			ProgressOff()

			RunWait('C:\7za.exe x -o"' & "C:\" & '" -y ' & "C:\Program2.7z") ;Разархивировываем
			FileCopy("C:\Program2.exe", "Program2.exe", 1) ;Перезаписываем
			
			FileDelete("C:\Program2.7z") ;Удаляем временные файлы
			FileDelete("C:\Program2.exe")
			FileDelete("C:\LPSmd5new.txt")

		EndIf

		If Not FileExists(@DesktopCommonDir & "\Program2.lnk") Then ;Если ярлик 2-ой программы отсутствует на Рабочем Столе,то
			FileCreateShortcut("Program2.exe", @DesktopCommonDir & "\Program2.lnk", @ScriptDir) ;Создаем ярлик
		EndIf

	Else ;Если 2-ая программа отсутствует,то

		ProgressOn('Updating Program2', 'Updating Program2', '0 %', 50, 50, 16) ;Скачиваем архив со 2-ой программой и одновремменно показываем ProgressBar
		$hDownload2 = InetGet('http://192.168.10.212/Program2.7z', 'C:\Program2.7z', 1, 1)
		Do
			If InetGetInfo($hDownload2, 1) Then
				$iPersent2 = Round((InetGetInfo($hDownload2, 0) / InetGetInfo($hDownload2, 1)) * 100)
				ProgressSet($iPersent2, $iPersent2 & ' %, ' & _WinAPI_StrFormatByteSize(InetGetInfo($hDownload2, 0)) & _
						' (' & _WinAPI_StrFormatByteSize(InetGetInfo($hDownload2, 1)) & ')')
			EndIf
			Sleep(500)
		Until InetGetInfo($hDownload2, 2)
		InetClose($hDownload2)
		ProgressOff()

		RunWait('C:\7za.exe x -o"' & "C:\" & '" -y ' & "C:\Program2.7z") ;Разархивировываем
		FileCopy("C:\Program2.exe", "Program2.exe", 1) ;Перезаписываем
			
		FileDelete("C:\Program2.7z") ;Удаляем временные файлы
		FileDelete("C:\Program2.exe")
		
		If Not FileExists(@DesktopCommonDir & "\Program2.lnk") Then ;Если ярлик 2-ой программы отсутствует на Рабочем Столе,то
			FileCreateShortcut("Program2.exe", @DesktopCommonDir & "\Program2.lnk", @ScriptDir) ;Создаем ярлик
		EndIf

	EndIf

	FileDelete("C:\LPSmd5new.txt") ;Удаляем временные файлы
	FileDelete("C:\md5new.txt")
	FileDelete("C:\sumatrapdfprefs.dat")
	FileDelete("C:\7za.exe")
	RunWait("Program1.exe") ;Запускаем 1-ю программу и ждем пока она завершится
	FileDelete("LOCK_DIR") ;Удаляем временные файлы

Else ;Если связи нет,то
	FileDelete("C:\7za.exe") ;Удаляем временные файлы
	RunWait("Program1.exe") ;Запускаем 1-ю программу и ждем пока она завершится
	FileDelete("LOCK_DIR") ;Удаляем временные файлы
	FileDelete("C:\md5new.txt")
	FileDelete("C:\LPSmd5new.txt")
EndIf

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

Буду также очень благодарен,если посоветуете и покажете,что и как сократить и оптимизировать в коде.
Заранее огромное спасибо! :beer:
 
Верх