windows nsis autorun

windows - Detectando si un programa ya está instalado con NSIS



autorun (4)

Esto se hace generalmente haciendo que NSIS inserte una clave de registro para su producto cuando se instala. Entonces es una manera fácil de detectar si esa clave de registro está presente y, de ser así, fianza

Estoy usando NSIS para crear un instalador para un programa, ¿cuál es la mejor manera de detectar si este programa ya está instalado? Además, como estoy ejecutando el instalador desde autorun.inf, ¿puedo salir inmediatamente del instalador si encuentra una copia instalada? ¿Hay una mejor manera de hacer esto?


Qué tal esto. Tenía esto en un viejo script de NSIS por ahí.

; Check to see if already installed ReadRegStr $R0 HKLM "SOFTWARE/Microsoft/Windows/CurrentVersion/Uninstall/<YOUR-APP-NAME>" "UninstallString" IfFileExists $R0 +1 NotInstalled messagebox::show MB_DEFBUTTON4|MB_TOPMOST "<YOUR-APP-NAME>" / "0,103" / "<YOUR-APP-NAME> is already installed." / "Launch Uninstall" "Cancel" Pop $R1 StrCmp $R1 2 Quit +1 Exec $R0 Quit: Quit NotInstalled:


He estado usando una prueba un poco más sofisticada que también verifica la versión del software instalado:

!define PRODUCT_VERSION "1.2.0" !include "WordFunc.nsh" !insertmacro VersionCompare Var UNINSTALL_OLD_VERSION ... Section "Core System" CoreSystem StrCmp $UNINSTALL_OLD_VERSION "" core.files ExecWait ''$UNINSTALL_OLD_VERSION'' core.files: ... WriteRegStr HKLM "Software/${PRODUCT_REG_KEY}" "" $INSTDIR WriteRegStr HKLM "Software/${PRODUCT_REG_KEY}" "Version" "${PRODUCT_VERSION}" ... SectionEnd ... Function .onInit ;Check earlier installation ClearErrors ReadRegStr $0 HKLM "Software/${PRODUCT_REG_KEY}" "Version" IfErrors init.uninst ; older versions might not have "Version" string set ${VersionCompare} $0 ${PRODUCT_VERSION} $1 IntCmp $1 2 init.uninst MessageBox MB_YESNO|MB_ICONQUESTION "${PRODUCT_NAME} version $0 seems to be already installed on your system.$/nWould you like to proceed with the installation of version ${PRODUCT_VERSION}?" / IDYES init.uninst Quit init.uninst: ClearErrors ReadRegStr $0 HKLM "Software/${PRODUCT_REG_KEY}" "" IfErrors init.done StrCpy $UNINSTALL_OLD_VERSION ''"$0/uninstall.exe" /S _?=$0'' init.done: FunctionEnd

Por supuesto, tiene que completar los detalles, esto solo le da un esqueleto aproximado.


Después de crear tu desinstalador crea una entrada de nombre de producto en el registro

!define PRODUCT_UNINST_ROOT_KEY "HKLM" !define PRODUCT_UNINST_KEY "Software/Microsoft/Windows/CurrentVersion/Uninstall/${COMPANY_NAME} ${PRODUCT_NAME}" Section -Post SetShellVarContext current WriteUninstaller "${UNINST_PATH}/uninst.exe" WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayName" "$(^Name)"

Para ver si el producto está instalado, haga

Function IsProductInstalled ClearErrors ReadRegStr $2 ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayName" StrCmp $2 "" exit

En tu desinstalación deberías estar haciendo

Section Uninstall DeleteRegKey ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}"