1 (изменено: ypppu, 2016-06-08 15:11:55)

Тема: AHK: Обновление скрипта

Доброго времени суток!

Я разработчик одного из скриптов для игры, к которому регулярно выпускаю обновления. Сейчас в сам скрипт встроена система проверки обновления через php. Если обновление есть - напишет что нового и предложит скачать. Пользователя перенаправляет на "Яндекс диск" и ему нужно самостоятельно скачивать новый файл и заменять старый.
Да, вроде как для пользователя действий не много, но хотел-бы узнать, можно ли автоматизировать этот процесс скачивания?

т.е. я бы хотел:

Я в файле на сайте помечаю что вышла новая версия и пишу что в ней нового (как и сейчас), после чего пользователь нажимает на "Обновить", и .exe файл автоматически скачивается в папку с скриптом. Если есть такое, поделитесь кодом, буду очень благодарен.

2

Re: AHK: Обновление скрипта

Да, можно.
1. UrlDownloadToFile на страницу где указана последняя вышедшая версия.
2. FileRead скачанный файл в переменную.
3. Сравнить текущую версию скрипта с последней вышедшей.
4. Если не равны - UrlDownloadToFile на страницу с кодом скрипта (вероятно, страница Яндекс.Диска для этого не подойдёт, т.к. файл (или текст кода) скрипта должны быть доступны по прямой ссылке).

3

Re: AHK: Обновление скрипта

(вероятно, страница Яндекс.Диска для этого не подойдёт, т.к. файл (или текст кода) скрипта должны быть доступны по прямой ссылке

Подойдет, если через Yandex API.

4

Re: AHK: Обновление скрипта

В коллекции скриптов, есть скрипт serzh82saratov в котором реализовано, и проверка на наличие обновлений и само обновление.

5

Re: AHK: Обновление скрипта

Раз уже все начали отвечать в неправильно оформленной теме, то я продолжу.
Nikva там про некомпилированный скрипт, и идёт просто замена текста в уже запущенном скрипте, и далее его перезапуск. Со скомпилированным всё по другому.

  • Качаем файл в другую папку (можно и в эту же, если имена предопределены)

  • Запускаем его с определённым параметром, вторым параметром передаём PID, третьим путь к оригинальному файлу

  • Закрываем процесс, ждём закрытия

  • Копируем скачанный с перезаписью оригинального

  • Запускаем оригинальный перезаписанный с определённым параметром, вторым параметром передаём PID, третьим путь к скачанному файлу

  • Закрываем процесс, ждём закрытия

  • Удаляем скачанный файл

  • Новая версия продолжает свою работу

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

6

Re: AHK: Обновление скрипта

Nikva пишет:

В коллекции скриптов, есть скрипт serzh82saratov в котором реализовано, и проверка на наличие обновлений и само обновление.

Там сказано что автоматическое обновление работает только в некомпилированном скрипте.

7 (изменено: ypppu, 2016-06-08 18:10:50)

Re: AHK: Обновление скрипта

serzh82saratov
Вы не могли бы это показать кодом? Буду очень благодарен, да и думаю другим эта тема пригодится.
С яндекс диском будут сложности, по этому можно и прямую ссылку на файл задавать.

8 (изменено: mirapi, 2016-06-08 17:43:07)

Re: AHK: Обновление скрипта

Сейчас вот как реализовал:


SetWorkingDir %A_ScriptDir%
#Include AHKBASE CU.ahk

url_version := " " ; Ссылка на файл проверки обновлений (там указываю версию скрипта)
script_version := 39 ; Версия вашего текущего скрипта.
last_version := JSON.Decode(GetLastVersionSoft(url_version)) ; Получение данных с сервиса проверки обновлений

if(last_version.status = "success") { ; Данные о обновлении успешно получены
	if(script_version < last_version.msg) 
	{ ; Есть новые обновления
		MsgBox, 68, Доступна новая версия скрипта, % "Обнаруженая новая версия программы!`n`nВ новой версии:`n" last_version.site "`n`nТекущая версия: " script_version "`nВы хотите скачать новую версию?" ; Показ диалогового окна с информацией о новой версии.
		IfMsgBox, Yes ; Если нажата кнопка YES выполняем действия ниже;
		{
			;Run % last_version.url ; Запустить ссылку которая указана на сайте для скачивания обновлений.
			URLDownloadToFile,ссылка/testupdate.ahk,testupdate.ahk 
			ExitApp ; Закрыть скрипт
		}
	}
} else if (last_version.status = "error") { ; Ошибка при проверке обновлений
	MsgBox, 16, Ошибка, % "Неудалось проверить наличие обновлений.`n`nКод ошибки: " last_version.code "`nТекст: " last_version.msg "" ; Показ диалогового окна с информацией о ошибке.
}

Ссылка на инклуд:
https://yadi.sk/d/Otl1RLQcsMDqA

При этом все работает только если скрипт не закомпилирован. Компилированный не хочет скачивать файл, почему-то.
Файл он скачивает, но не заменяет..

9

Re: AHK: Обновление скрипта

Как я понял, мне нужно удалить вначале этот .exe файл и скачать на его место новый. Но как удалить .exe файл если он еще используется?
Т.е. FileDelete не работает на тот файл, которым вызвала эта команда.

10

Re: AHK: Обновление скрипта

Проблему решил. Тему можно закрыть.

11

Re: AHK: Обновление скрипта

mirapi пишет:

Но как удалить .exe файл если он еще используется?

Мне тоже интересно.

12

Re: AHK: Обновление скрипта

SeaVodikendu пишет:
mirapi пишет:

Но как удалить .exe файл если он еще используется?

Мне тоже интересно.

Мой скрипт работает так:
> Пользователь запускает файл mvd.exe, идет проверка на обновление. Если есть новая версия и пользователь нажал "Обновить", идет дальше:
> С сервера скачивается 2 файла: mvd.exe и скрипт называет mvd2.exe и update.exe.
> Скрипт запускает файл update и закрывает mvd.
> Файл update удаляет файл mvd и переименовывает mvd2 в mvd.

Наверное можно как-то проще реализовать, но я сделал вот так)

13 (изменено: serzh82saratov, 2016-06-08 20:46:03)

Re: AHK: Обновление скрипта

По мотивам 5 поста, файл один, то есть сам скрипт. На github лежит текстовик, в нём прописано Version 2, и такой же Update.exe, но в котором Version := 2. Компилируем код ниже, имя скомпилированного файла может быть любое. Запускаем, смотрим в TrayTip текущую версию, соглашаемся обновить...


#SingleInstance Force
#NoEnv
Version := 1

TrayTip, %A_ScriptName%, Текущая версия: %Version%

Loop %0%
	ComParam%A_Index% := %A_Index%

If ComParam1 = /Update
	Update(ComParam2, ComParam3)
Else If ComParam1 = /TempDelete
	TempDelete(ComParam2, ComParam3)
Else
	CheckUpdate(Version)
Return

CheckUpdate(Version) {
	Http := ComObjCreate("WinHttp.WinHttpRequest.5.1"), Http.Option(6) := 0
	Http.Open("GET", "https://raw.githubusercontent.com/serzh82saratov/Update/master/README.md")
	Http.Send(), Text := Http.ResponseText
	New := RegExReplace(Text, "i).*?Version\s*(\d+)\s*", "$1")
	If (New <= Version)
		Return
	MsgBox, % 4+32+256, CheckUpdate, Есть новая версия, обновить с %Version% на %New%?
	IfMsgBox, No
		Return
	URLDownloadToFile, https://github.com/serzh82saratov/Update/blob/master/Update.exe?raw=true, %A_Temp%\Update.exe
	PID := DllCall("GetCurrentProcessId")
	Run %A_Temp%\Update.exe "/Update" "%PID%" "%A_ScriptFullPath%"
	ExitApp
}

Update(PID, Path) {
	Process, Close, %PID%
	Process, WaitClose, %PID%, 3
	If ErrorLevel
	{
		MsgBox, % 16, Update, Не удаётся закрыть процесс
		ExitApp
	}
	FileCopy, %A_ScriptFullPath%, %Path%, 1
	If ErrorLevel
	{
		MsgBox, % 16, Update, Не удалось копирование, возможно были запущены несколько экземпляров программы
		ExitApp
	}
	PID := DllCall("GetCurrentProcessId")
	Run %Path% "/TempDelete" "%PID%" "%A_ScriptFullPath%"
	ExitApp
}

TempDelete(PID, Path) {
	Process, Close, %PID%
	Process, WaitClose, %PID%, 2
	FileDelete, %Path%
}

Escape:: ExitApp

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

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui