Что нового

Скрипт для обновления основной программы по FTP

Хэж

Новичок
Сообщения
1
Репутация
0
AutoIt:3.2.14.2
Версия:1.0
Категория:Автоматизация, Сеть

Описание:
При запуске считывает настройки FTP из файла конфигурации, который расположен по адресу @ScriptDir & "\..\config.ini" (на уровень выше скрипта, предположительно в корне основной программы). соединение с ftp сервером происходит в пассивном режиме, поэтому не возникает конфликтов с антивирусами.
пример ini файла
[URLUpdate]
IP=192.168.10.50 #IP адрес сервера
port=21 #используемый порт
ftpLogin=user #логин
ftpPass=password #пароль
ftpPath=/update/MyProg3/ #папка с новой версией, расположенной на сервере

После установки соединения, происходит выгрузка всех файлов с подпапками в каталог на уровень выше от расположения скрипта(где находится файл с конфигурацией)
В процессе копирование идет отображение состояния копирования каждого файла и именем копируемого файла для информирования пользователя.

скрипт принимает один параметр - это путь к программе, которую необходимо запустить после обновления, например
D:\myProg\Updater>updater.exe d:\myProg\myProg.exe
если параметр отсутствует, то скрипт просто скачает обновление и закроется

Использование:
Запуск основной программы->
проверка наличия новой версии->
закрытие основной программы->
запуск данного скрипта с параметром->
после обновления скрипт закрывается и запускает обновленную (указанную в параметре) программу

весь процесс проверки обновления переложен на основную программу для корректной отработки закрытия программы и проверки новой версии в процессе работы.

Полезная информация
если графический интерфейс не требуется, то просто закоментируйте строку 39 GUISetState(@SW_SHOW)
в строках 59-63 в командах IniRead, третий параметр - это значение по умолчанию, на случай, если отсутствует ini файл
в строке 12 указан путь к ini файлу
функция dwnldFIles рекурсивно вызывается для скачивания во всех вложенных папках

Код:
#include <GuiConstantsEx.au3>
#include <FTPEx.au3>
#include <Array.au3>


$PIDs = ProcessList(@ScriptName) ;Возвращает двумерный массив, содержащий список выполняемых процессов (имя и PID).
if $PIDs[0][0] >= 2 then Exit 1 ;если процесс запущен, то выйти

Opt("GUIOnEventMode", 1)  ; Включает режим OnEvent
Opt("TrayIconHide", 1) ;спрятать иконку в трее

Global  $pathToConfFile = @ScriptDir & "\..\config.ini"

Global  $ftpOpen = _FTP_Open('MyFTP')
Global  $ftpConn
Global  $sPath


#Region GUI
Local $iGUIWidth = 230, $iGUIHeight = 80

GUICreate("Автообновление", $iGUIWidth, $iGUIHeight)
GUISetIcon(@ScriptFullPath, 0)
GUISetOnEvent($GUI_EVENT_CLOSE, "CLOSEClicked")

$lCurrentWork = GUICtrlCreateLabel("Инициализация", 15, 15, 200, 20) ;текст
$bProgressBar = GUICtrlCreateProgress(15, 40, 200, 20) ;прогресс бар

Func CLOSEClicked()
  Exit
EndFunc
#EndRegion



#Region GUI MESSAGE LOOP
GUISetState(@SW_SHOW)

Sleep(500)
FTPconn() ;соединение

Sleep(500)
dwnldFIles($sPath) ;скачивание файлов

GUICtrlSetData ($lCurrentWork, "Закрытие сессии")
_FTP_Close($ftpConn)
_FTP_Close($ftpOpen)

If $CmdLine[0] = 0 Then Exit ;если просто запущена
Run($CmdLine[1]) ;запуск программы после отработки обновления

GUIDelete()
#EndRegion GUI MESSAGE LOOP

#Region funcs
Func FTPconn()
   $sServer = IniRead($pathToConfFile,"ftpUpdate", "IP", "127.0.0.1") ;получить IP сервера, если нет, то выставить по умолчанию
   $sPort = IniRead($pathToConfFile,"ftpUpdate", "port", "21") ;получить IP сервера, если нет, то выставить по умолчанию
   $sUsername = IniRead($pathToConfFile,"ftpUpdate", "ftpLogin", "user") ;логин ФТП
   $sPass = IniRead($pathToConfFile,"ftpUpdate", "ftpPass", "password") ;пароль ФТП
   $sPath = IniRead($pathToConfFile,"ftpUpdate", "ftpPath", "/") ;путь для получения обновлений

   $ftpConn = _FTP_Connect($ftpOpen, $sServer, $sUsername, $sPass, 1, $sPort) ;открыть соединение
   If @error Then
	   GUICtrlSetData ($lCurrentWork, "Ошибка:" & @error)
	Else
	   GUICtrlSetData ($lCurrentWork, "Связь установлена")
	EndIf
EndFunc

Func dwnldFIles($curDir)
   _FTP_DirSetCurrent ($ftpConn, $curDir) ;присвоить указатель на текущую папку для работы с фтп

   Local $aFile = _FTP_ListToArray($ftpConn, 2) ;получить список файлов из текущей папки

   for $i = 1 to $aFile[0] ;прогнать весь массив файлов
	  GUICtrlSetData ($lCurrentWork, "Скачивание файла: " & $aFile[$i])
	  $destFoldef = StringReplace($curDir & '/', $sPath, '') ;сначала отрезаем путь до нужной нам папки
	  $destFoldef = StringReplace($destFoldef, '/', '\') ;меняем все косые на обратные
	  DirCreate (@ScriptDir & "\..\" & $destFoldef) ;если папки не сущетвует, то создаем
	  _FTP_ProgressDownload($ftpConn, @ScriptDir & "\..\" & $destFoldef & $aFile[$i], $curDir & "/" & $aFile[$i], UpdateGUIProgressBar) ;копируем файл с отображением состояния
   Next

   ;ищем подпапки
   Local $aDir = _FTP_ListToArray($ftpConn, 1) ;выбираем массив папок
   for $i = 1 to $aDir[0]
	  dwnldFIles($curDir & "/" & $aDir[$i]) ;повторяем всю процедуру для найденных папок
   Next
EndFunc

Func UpdateGUIProgressBar($iPercent)
    GUICtrlSetData($bProgressBar, $iPercent)
    Return 1 
EndFunc   ;==>_UpdateGUIProgressBar
#EndRegion
 

Вложения

  • updater.au3
    4.1 КБ · Просмотры: 20
Верх