Как мне потребовать от пользователя удалить предыдущую версию с помощью NSIS
-
23-08-2019 - |
Вопрос
Я только начал использовать НСИ.
Это работает очень хорошо, но я нахожу документацию немного неструктурированной.Как мне потребовать от пользователя удалить предыдущую версию перед установкой новой версии с НСИ?
НСИ (Nullsoft Scriptable Install System) - это система с открытым исходным кодом для создания установщиков Windows.
Решение
NSIS - отличный установщик Windows.Вот как я использую NSIS для удаления текущей версии при установке новой версии того же приложения.Добавьте следующую функцию в свой скрипт NSIS.
Function .onInit
Exec $INSTDIR\uninst.exe
FunctionEnd
Также вы можете проверить это ссылка на NSIS wiki на "Автоматическое удаление старого перед установкой нового".
Другие советы
Другой подход заключается в том, чтобы сделать UninstallPrevious
скрытый раздел и заставить его запускаться раньше всех других разделов программы установки.Я также предлагаю сделать так, чтобы деинсталлятор запускался бесшумно.
; The "" makes the section hidden.
Section "" SecUninstallPrevious
Call UninstallPrevious
SectionEnd
Function UninstallPrevious
; Check for uninstaller.
ReadRegStr $R0 HKLM "${HKLM_REG_KEY}" "InstallDir"
${If} $R0 == ""
Goto Done
${EndIf}
DetailPrint "Removing previous installation."
; Run the uninstaller silently.
ExecWait '"$R0\Uninstall.exe /S"'
Done:
FunctionEnd
Преимущество такого подхода заключается в том, что пользователь не будет удалять старую версию до тех пор, пока не будет готов установить новую версию.Более того, им даже не нужно принимать решение об удалении старой версии, она просто волшебным образом исчезает.
Конечно, в зависимости от ваших потребностей, вы можете захотеть, чтобы пользователь подтвердил удаление, и в этом случае используйте подход spinner_den .
Я повторно использую UninstallString
или QuietUninstallString
разделы реестра, которые записываются во время установки для последующего определения команды удаления.
Пара определяет вверху:
!define PROJECT_REG_UNINSTALL_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PROJECT_NAME}"
!define PROJECT_UNINSTALL_EXE "uninstall.exe"
В установщике Section
:
WriteRegStr HKLM "${PROJECT_REG_UNINSTALL_KEY}" "UninstallString" '"$INSTDIR\${PROJECT_UNINSTALL_EXE}" _?=$INSTDIR'
WriteRegStr HKLM "${PROJECT_REG_UNINSTALL_KEY}" "QuietUninstallString" '"$INSTDIR\${PROJECT_UNINSTALL_EXE}" /S _?=$INSTDIR'
И тогда в вашем .onInit
возьмите значение раздела реестра (существовало бы, если бы ваше приложение уже было установлено таким образом) и запустите его:
${If} ${Silent}
ReadRegStr $R0 HKLM "${PROJECT_REG_UNINSTALL_KEY}" "QuietUninstallString"
${Else}
ReadRegStr $R0 HKLM "${PROJECT_REG_UNINSTALL_KEY}" "UninstallString"
${EndIf}
ExecWait "$R0"