NSIS: продолжение установки после перезагрузки.
Например, у нас есть софтина, которая в процессе своей установки требует перезагрузку, после чего доустанавливается. Например, софт устанавливает свой драйвер, обновление, или же регистрирует системный сервис. Как реализовать инсталлятор для такой программы?
Изначально я хотел обойтись параметрами командной строки, добавляемыми при запуске установщика, но с ними произошла жопа, поэтому будем действовать более надежными методами.
0. Проверяем наличие уникального ключа Реестра, сигнализирующего о том, что надо выполнить вторую часть установки (после перезагрузки):
DetailPrint "Read After Reboot flag..."
ReadRegStr $R0 HKCU "Software\Microsoft\Windows\CurrentVersi on\"
"${APPNAME}_afterreboot"
StrCmp "$R0" "1" AfterReboot
1. Производим все действия, которые необходимо произвести до перезагрузки (устанавливаем драйвера, регистрируем DLL и т.д.)
2. Записываем в однократную автозагрузку (ключ Реестра
RunOnce
) наш инсталлятор, путь к exe файлу инсталлятора, который можно взять из переменной $EXEPATH
.Автозагрузку прописываем для текущего пользователя (пользователя, запустившего установщик), т.е. в ключ
HKEY_CURRENT_USER
.WriteRegStr HKCU
"Software\Microsoft\Windows\CurrentVersi on\RunOnce"
"${APPNAME}" "$EXEPATH"
Примечание: В
RunOnce
могут записаться программы, которые требуется выполнить однократно при загрузке системы. После выполнения программ, ключ RunOnce
очищается автоматически, что отличает его от ключа Run
, где данные не очищаются, и его можно использовать, как постоянную автозагрузку.3. Устанавливаем уникальный флаг, по которому будем определять, что инсталлятор был запущен после перезагрузки, например, таким образом:
DetailPrint "Write After Reboot flag..."
WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersi on\"
"${APPNAME}_afterreboot" "1"
4. Выдаем запрос на немедленную перезагрузку:
DetailPrint "Reboot request."
MessageBox MB_YESNO|MB_ICONINFORMATION
"Installation will be cobntinue after reboot. Press OK to reboot now." IDYES RebootID
Если пользователь ответил "
Yes
", сразу перезагружаемся: RebootID:
DetailPrint "Rebooting..."
Reboot
Если нет, ждем перезагрузки вручную:
DetailPrint "Installation continue if user restart system."
Goto SecEnd
5. После перезагрузки удаляем флаг (проверив его наличие, см выше):
DetailPrint "Delete After Reboot flag..."
DeleteRegValue HKCU "Software\Microsoft\Windows\CurrentVersi on\"
"${APPNAME}_afterreboot"
6. И продолжаем установку...
DetailPrint "Continue install after reboot..."
На GitHub
Это репост с сайта http://tolik-punkoff.com
Оригинал: http://tolik-punkoff.com/2019/08/12/nsis-p