Как я требую, чтобы пользователь удалил предыдущую версию с NSIS - PullRequest
10 голосов
/ 06 апреля 2009

Я только что начал использовать NSIS .
Это работает очень хорошо, но я нахожу документацию немного неструктурированной. Как потребовать от пользователя удалить предыдущую версию перед установкой новой версии с NSIS ?

NSIS (Nullsoft Scriptable Install System) - система с открытым исходным кодом для создания установщиков Windows.

Ответы [ 3 ]

13 голосов
/ 06 ноября 2009

Другой подход - создать скрытый раздел 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.

13 голосов
/ 06 апреля 2009

NSIS - отличный установщик Windows. Вот как я использую NSIS для удаления текущей версии при установке новой версии того же приложения. Добавьте следующую функцию в ваш скрипт NSIS.

Function .onInit

         Exec $INSTDIR\uninst.exe 

FunctionEnd

Также вы можете проверить эту ссылку в вики NSIS на "Автоматическое удаление старого перед установкой нового".

1 голос
/ 18 октября 2013

Я повторно использую ключи реестра 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"
...