1

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

Приветствую всех!
Столкнулся с проблемой, взял часть скрипта у одного человека в этой теме, что-то сделал под себя, но почему то скрипт работает не корректно.
При запуске если видит обновление, то он предлагает обновить, допустим мы соглашаемся, обновление проходит, скрипт скачивается в определенную папку и запускается, но он не копируется с помощью функции "Update" и собственно не удаляется уже скачанный файл через "TempDelete".
Уже много чего перепробовал, ничего не получается. Надеюсь на помощь.

Loop %0%{
	ComParam%A_Index% := %A_Index%
}
#SingleInstance Force
#NoEnv

Version := 1.00

TrayTip, AHK MoH (%GuiVersion%), Скрипт успешно запущен.

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

CheckUpdate(Version) {
	NewVersionHTTP := ComObjCreate("WinHttp.WinHttpRequest.5.1")
	NewVersionHTTP.Open("GET", "https://github.com/sokolin05/profile.moh/raw/master/version.profile.md", true)
	NewVersionHTTP.Send()
	NewVersionHTTP.WaitForResponse()
	NewVersion := NewVersionHTTP.ResponseText
	If (NewVersion <= Version){
		; MsgBox, 16, Обновление, Новых версий скрипта не найдено.
		Gosub, NoUpdate
		Return
	}
	Else{
		MsgBox, % 4+64+256, Обновление, Найдена новая версия скрипта!`nОбновить с %Version% до %NewVersion%?
		IfMsgBox, No
		{
			Gosub, NoUpdate
			Return
		}
		IfMsgBox, Yes
		{
			URLDownloadToFile, https://github.com/sokolin05/profile.moh/raw/master/ahk.moh.exe, %A_Temp%\ahk.moh.exe
			PID := DllCall("GetCurrentProcessId")
			Run %A_Temp%\ahk.moh.exe, "/Update" "%PID%" "%A_ScriptFullPath%"
			ExitApp
		}
	}
}

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

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

В самом скрипте есть и файл, с которого берется версия и сам AHK.

2

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

Для примера можно было бы просто два кода представить, так приходится запускать '.exe' для тестов, причём я так понял это разработка не публичная и защиты в ней нет.

Win10x64, AHK v1.1.33.09 (Unicode 64-bit) | AHK-Wiki | Переменные и выражения | RegEx101

3

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

alexsokolin Отправляешь параметры запуска на апдейтер:


auto_update()
{
	Current_version := 1.001
	name := "test v1.1"
	try {
		PID := DllCall("GetCurrentProcessId")
		URL := "http://google.com/new_version.exe"
		old_File_path := A_ScriptFullPath
		new_File_path := A_ScriptDir "\" name ".exe"
		link := "http://google.com/update.txt"

		http := ComObjCreate("WinHTTP.WinHTTPRequest.5.1")
		http.Open("GET", link, False)
		http.Send()
		http.WaitForResponse()
		Server_version := http.responseText
	}
	catch {
		OnException("Ошибка с подключением: 5")
		Exit
	}
	If (Server_version > Current_version)
	{
		Progress, b CWFFFFFF CT000000 FM14,, Подождите... ,, Raleway
			Progress, 25
			Sleep, 250
		if !FileExist("test.exe")
			{
				Progress, OFF
				OnException("Не существует файла апдейтера: 3")
				Exit
			}
		try {
		UrlDownloadToFile, %URL%, %name%.exe
			sleep, 250
			Progress, 75
		}
		catch {
			OnException("Нет подключения к интернету: 4")
			Exit
		}
		Run, test_updater.exe "%PID%" "%old_File_path%" "%new_File_path%"
			Sleep, 250
			Progress, 99
			Sleep, 250
			Progress, OFF
		ExitApp
	}
	return
}

Сам апдейтер:


#NoEnv
SetWorkingDir %A_ScriptDir%

if (A_IsCompiled != 1)
	ExitApp

if A_Args.Count() > 3
	ExitApp
else if A_Args.Count() > 0
{
	for index, element in A_Args
	{
		first_element := SubStr(element, 1, 1)
		if (first_element = "-")
		{
			element := SubStr(element, 2)
		}
		input_parametrs%index% := element
	}
	;	input_parametrs1 = PID
	;	input_parametrs2 = old_File_path
	;	input_parametrs3 = new_File_path
	if !FileExist(input_parametrs2)
		ExitApp
	old_version(input_parametrs1, input_parametrs2)
	new_version(input_parametrs2, input_parametrs3)
	run %input_parametrs2%
}
else ExitApp

ExitApp

old_version(old_PID, old_File_path) 
{
	Process, Exist, %old_PID%
	if Errorlevel != 0
	{
		Process, Close, %old_PID%
		Process, WaitClose, %old_PID%, 1
		if ErrorLevel != 0
		{
			OnException("Err: 1")
			ExitApp
		}
	}

	if FileExist(old_File_path) 
	{
		FileDelete, %old_File_path%
		if ErrorLevel != 0
		{
			OnException("Err: 2")
			ExitApp
		}
	}
	return
}

new_version(old_File_path, new_File_path) 
{
	if FileExist(new_File_path)
	{
		FileMove, %new_File_path%, %old_File_path%, 1
		if ErrorLevel != 0
		{
			OnException("Err: 2")
			ExitApp
		}
	}
	return
}
GD

4

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

Странно, сделал вроде бы все правильно. Первый скрипт запихнул в один файл, его закинул на github, второй также сделал со вторым кодом.
При запуске писало, что нет такой функции как "OnException", поменял на "Throw Exception", при запуске он запускается и выключается либо вообще не запускается.

5 (изменено: Botsy, 2022-05-08 23:20:55)

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

alexsokolin Замени на msgbox и посмотри какую ошибку будет давать. И оба должны быть скомпилированны. Ну и версии должны отличаться, на гите более новая офк.

GD

6

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

Хорошо, попробую.