Как мне потребовать от пользователя удалить предыдущую версию с помощью NSIS

StackOverflow https://stackoverflow.com/questions/719631

  •  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"
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top