Упаковать программу в инсталлятор (sfx)

Установщик предназначен для корректной интеграции программы в систему. Настроит все переменные, выставит разрешения и создаст ярлыки, если это нужно. Задача эта, при разработке нативных приложений, встречается часто.

Какие есть решения

Есть готовые решения, да. Но мне лично удобнее иметь обычный архив вместо бинарника. Для его распаковки не нужны дополнительные инструменты.

Архиватор WinRAR позволяет тонко настраивать сценарий распаковки. Но если очень надо, можно написать вспомогательный скрипт install.bat

Что требуется для установки

Использую SFX-архивы для публикации портабельных программ, в телеграм-канале @FeelSoft. Соответственно, требования составлял для себя

Сценарий распаковки Portable

image

Сценарий самодостаточный, даже комментарии написаны понятно. Что была такая красота как на скриншоте, нужно прописать следующий текст

;Упаковывать именно файлы, а не папку  
;Тип архива: ZIP  
;В названии файла добавить номер версии  
;Галка "Создать SFX-архив"  
;Установить пароль "123" (если нужен)  
;Вставить сценарий на вкладке "Комментарий"  
;Поменять содержимое строк Path и Shortcut по вкусу  

Path=%SYSTEMDRIVE%\soft\WizTree
SavePath
Setup=.\
Title=Установка...
Text
{
Программа распространяется "как есть" и нет никаких
гарантий что у вас она будет корректно работать.<br><br>
Инсталлятор создаст ярлык в меню "Пуск"<br><br>
<b>Желаете продолжить?</b><br>
Чтобы узнать пароль, решите задачку: <br>
100+23=?
}
Shortcut=P, ".\", , , "WizTree", 

Команда Shortcut в самом низу указывает архиватору, что надо создать ярлык в меню “Пуск”. Это единственное вмешательство в систему при распаковке портабельной программы. Так в будущем ее будет легче найти через поиск

image

Распаковка многофайлового установщика

Когда программа распространяется в виде набора файлов, не всегда удобно делиться инсталлятором. Поэтому я упаковываю такие проги в один sfx-архив. WinRAR может взять на себя функцию мониторинга за процессом установки. Но я все-равно сделал дополнительный скрипт-прокладку. Он запускаясь создает большое черное окно, так я могу понять что инсталлятор начал запускаться (иногда это важно). И что установка еще продолжается.

Сценарий SFX-архива

Архиву надо указать, что бы он распаковывался во временную папку. В логику SFX-модуля уже заложено что бы ждать завершения программы инсталлятора. После завершения установки модуль SFX уберется за собой и удалит временную папку.

;Расположенный ниже комментарий содержит команды SFX-сценария

Setup=install.bat
TempMode="Что-бы продолжить реши задачку:\n  100+23=?","Распковка..."
Silent=2

Задачка здесь нужна как защита от дурака при распаковке опасных программ. Если архив будет не запаролен, поле ввода просто не появится. Строкой Silent=2 просто настраиваем красоту в окошках

Скрипт install.bat

Скрипт определяет какой разрядности система. В зависимости от этого он может запустить для установки файл нужной разрядности. Это работатет в Windows 10 и не работает в Windows 7

if defined PROCESSOR_ARCHITEW6432 (set arch=64) else If "%PROCESSOR_ARCHITECTURE%"=="AMD64" (set arch=64)

При обновлении версии программы меняется имя исполняемого файла. Но скрипт ведь умный, он может подобрать нужное имя по маске

FOR %%i IN ("WinRar*_RusX64.exe") DO Set FileName="%%i"

Осталось сделать bat-файл, расставить IF в нужных местах и в путь

@echo off
@chcp 1251 > nul
title Installing...
cd /d %~dp0
cd
echo. Выполняется установка...
if defined PROCESSOR_ARCHITEW6432 (set arch=64) else If "%PROCESSOR_ARCHITECTURE%"=="AMD64" (set arch=64)
if %arch%==64 (
	echo. Версия: 64bit
	FOR %%i IN ("WinRar*_RusX64.exe") DO Set FileName="%%i"
) else (
	echo. Версия: 32bit
	FOR %%i IN ("WinRar*_RusX32.exe") DO Set FileName="%%i"
)
echo. Файл:  %FileName%
start "" /wait %FileName%
timeout /t 1 >nul
echo.
echo. УСТАНОВКА ЗАВЕРШЕНА
echo. 
timeout /t 4
exit

Результат

Установщик распаковался и передал управление скрипту install.bat. Мне очень понравилось что теперь комп сам решает какой он разрядности при установке програм

image


Обсуждение завершено.