warezoogle3
Новичок
- Сообщения
- 73
- Репутация
- 1
Хотел бы поделится модулем автообновления со сообществом. Может кому-то будет нужно.
И заодно появились некоторые проблемы и вопросы.
Вот код с комментариями.
Так вот,тестировал на виртуальных машинах с разными ОС,все нормально,но...
На некоторых реальных машинах постоянно скачивает и обновляет 2-ю программу.Такое впечатление,что не находить вторую программу во время проверки.
Буду также очень благодарен,если посоветуете и покажете,что и как сократить и оптимизировать в коде.
Заранее огромное спасибо! :beer:
И заодно появились некоторые проблемы и вопросы.
Вот код с комментариями.
Код:
#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: