Попробовал с батником. Ну для эксперимента, работает нормально: основная программа проверяет версию -> скачивает новую -> запускает батник и выходит из программы -> батник удаляет основную программу, переименовывает новую в старую -> запускает новую. Но по мне выглядит это не очень надёжно.
Во-первых, батник привязан по названию программ. Их можно изменить и т.д. Лучше было бы привязывать по PID процесса, чтобы удалить 100% нужную программу, но не нашел инфу как передать PID в батник при запуске. Во-вторых, привязан локально. Файлы могут разделить и т.д., и если программы не будет в каталоге с батником - ничего не получится. В-третьих, открывается командная строка и это может пугать пользователя или типо того. В-четвёртых, выполнение команд в батнике фиксировано задержкой между командами, а не их фактическим выполнением. У кого-то комп динозавр и команды не будут выполнены корректно.
В общем, в каталогах нормальных программ не нашел батников, хотя они обновляются красиво. За-то всегда есть 2-3 дополнительных ярлыка с названиями типо "service, update и прочее". Попробую альтернативный метод, без батника, а с промежуточной программой.
If (Server_version > Current_version)
{
UrlDownloadToFile, %URL%, delete_download.exe
if !FileExist("delete_download.exe")
ExitApp
Run, test.bat
ExitApp
}
test.bat
@timeout /t 2
@erase "%~dp0delete_bat.exe" ; удаляем старую программу
@timeout /t 1
@rename delete_download2.exe delete_download.exe ; переименовываем новую в старую
@timeout /t 1
@start "" "%~dp0delete_download.exe" ; запускаем новую
GD