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, dado que estoy ejecutando el instalador desde autorun.inf, ¿puedo salir inmediatamente del instalador si encuentra una copia instalada? ¿Hay una mejor manera de hacer esto?Detectando si un programa ya está instalado con NSIS
Respuesta
¿Qué tal esto? Tenía esto en un antiguo 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:
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
¿Algún ejemplo o puntero que puedas dar al hacer eso? –
He estado usando una prueba un poco más sofisticado que también comprueba 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
Usted, por supuesto, tienen que rellenar los datos, esto sólo le da una áspera esqueleto.
Después de crear el programa de desinstalación de crear un ingreso en el nombre del 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 se ha instalado el producto lo hacen
Function IsProductInstalled
ClearErrors
ReadRegStr $2 ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayName"
StrCmp $2 "" exit
En su desinstalación que debería estar haciendo
Section Uninstall
DeleteRegKey ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}"
- 1. Detectando si java está instalado y habilitado con javascript
- 2. Cómo verificar con C# donde está instalado un programa
- 3. ¿Detecta si Mod_Security está instalado con PHP?
- 4. Detectando si el monitor está apagado
- 5. ¿Prueba si un control ActiveX está instalado con Javascript?
- 6. Verificar si Solidworks está instalado?
- 7. ¿Cómo eliminar un programa instalado con distutils?
- 8. ¿Cómo comprobar si Suhosin está instalado?
- 9. Detectando si SQL Server Compact Edition 3.5 SP2 x64 está instalado?
- 10. Cómo verificar si un programa está instalado en el sistema Windows
- 11. ¿Comprueba si IIS está instalado o no?
- 12. instalación msiexec tranquila cuando el paquete ya está instalado
- 13. ¿Detectando si se está reproduciendo la música?
- 14. iOS - detectando si Game Center está deshabilitado
- 15. Detectando si ya se está ejecutando otra instancia de la aplicación
- 16. Instalación de Passenger cuando Nginx ya está instalado; ¿Posible?
- 17. Compruebe si el archivo ya está abierto
- 18. ¿Cómo comprobar si está correctamente instalado mongodb
- 19. Detectando si el caché de un navegador está lleno
- 20. Cómo detectar si numpy está instalado
- 21. ¿Cómo puedo detectar si quicktime está instalado con javascript?
- 22. ¿Cómo verifico si un MSI particular está instalado?
- 23. Detectando si un navegador está en modo de pantalla completa
- 24. ¿Cómo puedo verificar si un módulo Perl está instalado?
- 25. ¿Cómo determinar si el proveedor de VFPOLEDB está instalado/registrado?
- 26. PHP - ¿Cómo saber si X-Sendfile está disponible e instalado?
- 27. ¿Cómo fallar correctamente si .NET no está instalado?
- 28. ¿Cómo saber si el componente VBA de Office está instalado?
- 29. Coldfusion: Detectando si está siendo ejecutado por el programador
- 30. Compruebe si el servidor SQL (cualquier versión) está instalado?
Usted mencionó Lanzar Desinstalar. Realmente no pude invocar Desinstalar en mi script .nsi usando este código anterior. ¿Me puede decir cómo puedo llamar a Desinstalar si mi programa ya está instalado? – Jango
Tuve que cambiar la línea 'messagebox :: show' a' MessageBox MB_YESNO "$ {YOUR_APP_NAME} ya está instalado. ¿Desinstalar la versión existente?"/SD IDYES IDNO Salir'. –
No siempre es verdad. Algunos software no tienen un directo en Desinstalar, por ejemplo, C++ visual redistribuible. En tales casos, es posible que tengamos que iterar sobre todas las claves en Desinstalar y verificar los datos de valor del nombre de valor "DisplayName" –
Yorkwar