Auto Updater

Tire suas dúvidas sobre programação em AutoHotkey

Moderator: Gio

thalesduarte
Posts: 95
Joined: 13 Sep 2021, 06:08

Auto Updater

Post by thalesduarte » 16 Sep 2022, 13:40

Olá, boa tarde.
Existe algum código ou alguma explicação sobre algum código de auto updater do hk?

Tenho um código que constantemente preciso ficar atualizando, porém as pessoas precisam ficar sobrescrevendo a cada atualização.

Como posso fazer uma validação sobre isso?

Atualmente faço da seguinte forma.

Coloco uma versão na aplicação.
faço uma requisição get na internet, para pegar a versão na internet, e comparo.

Quando está diferente, ele não deixa continuar com a aplicação e pede para a pessoa sobrescrever.

No caso, gostaria de uma luz para entender como posso fazer a atualização automática do código, sem ser necessário a pessoa baixar manual.

User avatar
Gio
Posts: 1257
Joined: 30 Sep 2013, 10:54
Location: Brazil

Re: Auto Updater

Post by Gio » 16 Sep 2022, 15:58

Boa tarde.
Atualmente faço da seguinte forma.

Coloco uma versão na aplicação.
faço uma requisição get na internet, para pegar a versão na internet, e comparo.

Quando está diferente, ele não deixa continuar com a aplicação e pede para a pessoa sobrescrever.

Certo, a parte de comparar versões para saber se tem atualizações novas parece estar boa (pelo menos a descrição corresponde ao que é feito normalmente). Mas porque o script atualizador não baixa e sobreescreve automaticamente o arquivo do script em atualização? Você já tem um servidor FTP ativo com um link de onde se possa baixar a versão mais recente? Tanto URLDownloadToFile e FileMove permitem sobreescrever arquivos no destino (logo você pode em tese baixar direto no lugar do arquivo antigo ou baixar em uma pasta temporária e depois movimentar pra lá). Você pode tentar também baixar em outro lugar e antes de mover, checar a integridade do novo arquivo e depois deletar o arquivo antigo com FileDelete (para que não seja necessário sobreescrever) antes de mover o novo para a posição do antigo.

:arrow: Teste todas as possibilidades. E se esses comandos estiverem simplesmente falhando, tente primeiro pedir privilégios de administrador para o script atualizador. Você pode fazer isso colocando essas linhas no começo dele:

Code: Select all

if not A_IsAdmin ; Exigir permissão de nivel administrativo (necessário para manipular o IE através de comandos COM).
{
	Try
	{
		Run *RunAs "%A_ScriptFullPath%"  ; Requires v1.0.92.01+
	}
	msgbox, 0x10, Erro, O acesso administrativo é necessário para a execução do aplicativo.
   ExitApp
}

:arrow: Também pode ser que o computador do cliente tenha alguma antivírus ou outra proteção ativada que impeça download e/ou movimentação de arquivos .exe. Se for esse o caso, pode valer a pena investigar o que está bloqueando a rotina. Pode ser que você esteja simplesmente tentando colocar o arquivo em uma pasta mais protegida do computador (costuma ser mais tranquilo colar arquivos na área de trabalho do que na pasta arquivos de programas, por exemplo). Mas também pode ser que seja um bloqueio mesmo (antivírus, etc). Alguns bloqueios podem ser evitados e outros não. Mas nesse caso cabe ao cliente ou ao seu TI adicionar as exceções corretas ao antivírus dele. Mas em último caso você pode oferecer suporte remoto, caso seja um cliente pequeno.

thalesduarte
Posts: 95
Joined: 13 Sep 2021, 06:08

Re: Auto Updater

Post by thalesduarte » 16 Sep 2022, 17:47

Boa noite.
Obrigado @Gio

#EDIT
Estou utilizando o GITHUB como repositório das minhas atualizações.
Acredito que seja uma boa para quem pensa em realizar procedimentos como esses.


Vou testar essa situação utilizando o google drive.

Muito obrigado pelo esclarecimento!
Gio wrote:
16 Sep 2022, 15:58
Boa tarde.
Atualmente faço da seguinte forma.

Coloco uma versão na aplicação.
faço uma requisição get na internet, para pegar a versão na internet, e comparo.

Quando está diferente, ele não deixa continuar com a aplicação e pede para a pessoa sobrescrever.

Certo, a parte de comparar versões para saber se tem atualizações novas parece estar boa (pelo menos a descrição corresponde ao que é feito normalmente). Mas porque o script atualizador não baixa e sobreescreve automaticamente o arquivo do script em atualização? Você já tem um servidor FTP ativo com um link de onde se possa baixar a versão mais recente? Tanto URLDownloadToFile e FileMove permitem sobreescrever arquivos no destino (logo você pode em tese baixar direto no lugar do arquivo antigo ou baixar em uma pasta temporária e depois movimentar pra lá). Você pode tentar também baixar em outro lugar e antes de mover, checar a integridade do novo arquivo e depois deletar o arquivo antigo com FileDelete (para que não seja necessário sobreescrever) antes de mover o novo para a posição do antigo.

:arrow: Teste todas as possibilidades. E se esses comandos estiverem simplesmente falhando, tente primeiro pedir privilégios de administrador para o script atualizador. Você pode fazer isso colocando essas linhas no começo dele:

Code: Select all

if not A_IsAdmin ; Exigir permissão de nivel administrativo (necessário para manipular o IE através de comandos COM).
{
	Try
	{
		Run *RunAs "%A_ScriptFullPath%"  ; Requires v1.0.92.01+
	}
	msgbox, 0x10, Erro, O acesso administrativo é necessário para a execução do aplicativo.
   ExitApp
}

:arrow: Também pode ser que o computador do cliente tenha alguma antivírus ou outra proteção ativada que impeça download e/ou movimentação de arquivos .exe. Se for esse o caso, pode valer a pena investigar o que está bloqueando a rotina. Pode ser que você esteja simplesmente tentando colocar o arquivo em uma pasta mais protegida do computador (costuma ser mais tranquilo colar arquivos na área de trabalho do que na pasta arquivos de programas, por exemplo). Mas também pode ser que seja um bloqueio mesmo (antivírus, etc). Alguns bloqueios podem ser evitados e outros não. Mas nesse caso cabe ao cliente ou ao seu TI adicionar as exceções corretas ao antivírus dele. Mas em último caso você pode oferecer suporte remoto, caso seja um cliente pequeno.

dieissonc
Posts: 22
Joined: 29 Apr 2019, 08:40

Re: Auto Updater

Post by dieissonc » 01 Nov 2022, 13:57

Tive uma situação semelhante na empresa que trabalho, porém, aqui não utilizo um servidor na nuvem para atualizar, mas sim uma base de dados.
A parte do código que acabei montando(peguei alguns códigos no forum mas não me recordo exatamente de quem, portanto não vou poder dar créditos dessa vez) é essa:

Code: Select all

update_software	:=	"ToolTip, Atualizando " software " para versão " sql[2, 3]
				.	"`nSleep, 2000"
				.	"`nFileDelete,"	A_ScriptFullPath "`nsleep 1000"
				.	"`nFileMove,"
								.	SubStr( A_ScriptFullPath, 1 , -4 ) "_new.exe,"
								.	A_ScriptFullPath ", 1`nsleep 1000"								
				.	"`nLoop	{"
				.	"`n	Sleep, 500"
				.	"`n	If fileExist( """ A_ScriptDir "\" software "_new.exe"" )"
				.	"`n		Break"
				.	"`n	Else If ( A_Index > 20 ) {"
				.	"	;REMOVI O TRATAMENTO DE FALHA AO ATUALIZAR, PQ UTILIZA UM MÉTODO INTERNO QUE NÂO VAI TE AGREGAR EM NADA"
				.	"`n	Exitapp"
				.	"`n	}"
				.	"`n}"
				.	"`nRun, "		A_ScriptFullPath
				.	"`nExitapp"
	async( update_software )	;	executa a atualização assíncrona
ExitApp

async( Script )	{
	shell	:= ComObjCreate("WScript.Shell")
	exec	:= shell.Exec( A_AhkPath " /ErrorStdOut *")
	exec.StdIn.Write( script )
	exec.StdIn.Close()
}
Basicamente :
  • Executa uma instância separa de um script ahk para deletar o executável.
  • Gera um novo executável com a nova versão com "_new" ao final do nome(não utilizei o mesmo nome direto pois faço um tratamento de erros para ter certeza que foi deletado).
  • Após a verificação e tratamento, renomeia para o nome correto e executa a aplicação atualizada.
Acredito que caso não tenha solucionado ainda, possa te servir ao menos de um começo, e caso já tenha solucionado, por gentileza compartilhe, pode nos ser útil também.

Post Reply

Return to “Ajuda e Suporte Geral”