2011-01-13 19 views
9

Tengo un instalador, un script compilado de NSIS y primero comprueba si otra versión de mi aplicación se está ejecutando en el sistema. Si existe otra instancia, primero desencadena la desinstalación silenciosa y luego continúa con la instalación de la nueva intancia.¿Cómo ejecutar un desinstalador de NSIS desde otro instalador de NSIS y esperar a que termine?

Uso ExecWait para activar el unistaller en el modo silencioso, pero mi proceso de instalador principal no espera y continúa con el proceso de instalación.

¿Cómo forzo al instalador principal a esperar a que se complete primero la desinstalación silenciosa?

Respuesta

11

Hay un desinstalador especial parameter necesita utilizar (La razón de esto es que normalmente el desinstalador debe ser capaz de borrarse a sí mismo)

ExecWait '"$INSTDIR\uninstaller.exe" /S _?=$INSTDIR' 
+1

+1: Creo que esto no responde a la pregunta, funciona de todos modos para aplicaciones pequeñas. Por lo tanto, +1 para la solución :-). En realidad, ExecWait aún no espera al final del desinstalador, pero el desinstalador ahora se ejecuta silenciosamente (/ S) en segundo plano. Si el desinstalador lleva mucho tiempo, desinstalaría también los datos instalados actualmente. Por lo tanto, desinstalador e instalador funcionarían en paralelo. ¡Así que pon atención! –

+1

@Valentin: ¿Qué te hace pensar que ExecWait no espera? Hace WaitForSingleObject (hChildProcess, INFINITE); – Anders

+0

+1 Consulte [aquí] (http://nsis.sourceforge.net/Auto-uninstall_old_before_installing_new) para saber cómo implementar esto en una función '.onInit'. –

6

No se trata sólo de "ExecWait". También se trata de "_?", Una instrucción especial de desinstalación. En realidad, durante la desinstalación, uninstaller.exe se copia en un directorio temporal y luego se ejecuta desde allí.

Este paso de copiar e invocar un nuevo desinstalador desde el directorio temporal puede ser rápido y la llamada volvería inmediatamente sin esperar a que se complete el desinstalador.

Al usar "_?" instrucción le dice a NSIS que ejecute el desinstalador desde el mismo lugar y no desde el directorio temporal.

Al usar "ExecWait" además del "_?" usted le dice a NSIS que espere a que se complete el proceso de "desinstalación" y luego regrese. De esta manera logras lo que necesitas.

consulte http://nsis.sourceforge.net/Docs/Chapter3.html#3.2.2 para obtener más información.

Cuestiones relacionadas