2009-04-05 35 views

Respuesta

13

NSIS es un gran instalador de Windows. Así es como utilizo NSIS para desinstalar la versión actual mientras instalo una nueva versión de la misma aplicación. Agregue la siguiente función a su secuencia de comandos NSIS.

Function .onInit 

     Exec $INSTDIR\uninst.exe 

FunctionEnd 

También puedes leer la this enlace en el wiki NSIS en "auto-desinstalación antes de instalar el nuevo".

+1

+1 para el enlace –

+2

No use $ INSTDIR. Use el valor que lee del registro para asegurarse de que sea el correcto. – utapyngo

13

Otro enfoque es hacer una sección oculta UninstallPrevious y hacer que se ejecute antes que todas las otras secciones en el instalador. También sugiero que el desinstalador se ejecute en silencio.

; 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 

La ventaja de este enfoque es que el usuario no va a desinstalar la versión anterior hasta que estén listos para instalar la nueva versión. Además, ni siquiera tienen que tomar una decisión sobre la desinstalación de la versión anterior, simplemente desaparece mágicamente.

Por supuesto, dependiendo de sus necesidades, es posible que desee que el usuario confirme la desinstalación, en cuyo caso utilice el enfoque de spinner_den.

+1

Cuando obtiene datos en '$ R0' ¿no debería usarlos en el' ExecWait'? – svrist

+0

Escribí eso hace 2 años, pero sí, eso suena bien. – cdmckay

1

Reutilizo las claves de registro UninstallString o QuietUninstallString que se escriben durante la instalación para determinar posteriormente el comando del desinstalador.

Un par define en la parte superior:

!define PROJECT_REG_UNINSTALL_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PROJECT_NAME}" 
!define PROJECT_UNINSTALL_EXE "uninstall.exe" 

En el instalador 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' 

Y luego, en su .onInit agarrar el valor clave de registro (existiría si su aplicación ya que se instaló la forma) y ejecutarlo:

${If} ${Silent} 
    ReadRegStr $R0 HKLM "${PROJECT_REG_UNINSTALL_KEY}" "QuietUninstallString" 
${Else} 
    ReadRegStr $R0 HKLM "${PROJECT_REG_UNINSTALL_KEY}" "UninstallString" 
${EndIf} 
ExecWait "$R0" 
Cuestiones relacionadas