2009-04-05 10 views
9

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

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

ответ

13

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

Function .onInit 

     Exec $INSTDIR\uninst.exe 

FunctionEnd 

Также вы можете проверить this ссылку на вики NSIS на «Авто-деинсталлировать старый перед установкой нового».

+1

+1 для ссылки –

+2

Не используйте $ INSTDIR. Используйте значение, которое вы читаете в реестре, чтобы убедиться, что оно правильно. – utapyngo

13

Другим подходом является создание скрытой секции UninstallPrevious и ее запуск перед всеми остальными разделами установщика. Я также предлагаю сделать работу uninstaller незаметно.

; 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.

+1

Когда вы получаете данные в '$ R0', вы не должны использовать его в' ExecWait'? – svrist

+0

Я написал, что 2 года назад, но да, это звучит правильно. – cdmckay

1

Повторное использование 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"