NSIS _?=$INSTDIR interruptor en ExecWait elimina el uninstaller.exe al reiniciar

Tengo una Instalador de NSIS que llama al desinstalador para desinstalar la versión anterior.

EjecutivoEsperar $INSTDIR\uninstall.exe /S _?=$INSTDIR . Las _? El interruptor se usa para hacer que el instalador espere hasta que se complete la desinstalación.

De hecho, espera hasta que se completa la desinstalación. Pero cuando reinicio mi máquina, uninstall.exe no está presente bajo $INSTDIR.

La sección de desinstalación tiene comandos para eliminar algunos subdirectorios en $INSTDIR con /REBOOTOK interruptor.

Ejemplo: RmDir /r /REBOOTOK $INSTDIR\client

¿Esto hará que se elimine uninstall.exe al reiniciar la máquina?

preguntado el 03 de mayo de 12 a las 11:05

2 Respuestas

¿Cuál es la posición de este ExecWait declaración con respecto a la sección que implementa el programa de desinstalación?

Es posible que el desinstalador se elimine solo (o intente hacerlo) y que haya un conflicto entre él y el "nuevo desinstalador" relacionado con la forma en que se elimina: como un ejecutable no se puede eliminar durante su ejecución, en su lugar, se marca para su eliminación. durante el siguiente arranque (si usa el /REBOOTOK opción). Después de eso, está implementando el "nuevo desinstalador" y, si tiene el mismo nombre, se elimina en el siguiente arranque.

Podrías intentar jugar con el VIAddVersionKey declaración para definir una versión para el nuevo instalador que es diferente de la anterior. Luego, después de la instalación, verifique si es el desinstalador nuevo o anterior.

Consulte también el registro si tiene un HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\PendingFileRenameOperations valor multi_sz que podría contener el nombre de su desinstalador si está marcado para su eliminación durante el próximo arranque.

contestado el 04 de mayo de 12 a las 12:05

Gracias por la respuesta. Estás en el clavo. El programa de desinstalación intenta eliminarse durante la desinstalación. Delete /REBOOTOK $INSTDIR\uninstall.exe. No puede eliminarse a sí mismo mientras se está ejecutando, por lo que borra el nuevo desinstalador al reiniciar. ¡Gracias de nuevo por señalarme en la dirección correcta! - gshank

De nada :o) Acabo de editar mi respuesta con fines históricos como quise decir CurrentControlSet y no ControlSet001 (Fallé mi copia/pegado) pero lo obtuviste de todos modos. - Seki

El objetivo de /REBOOTOK es eliminar archivos que están en uso. Pero RmDir /r /REBOOTOK $INSTDIR\client no debe quitar $INSTDIR\uninstall.exe, ¿estás seguro de que no tienes un RmDir /r /REBOOTOK $INSTDIR llamar allí?

Usar /REBOOTOK aquí probablemente no sea una buena idea, sin importar cómo lo mires. Una vez que el usuario reinicie, se eliminarán todos los archivos en $INSTDIR\client (archivos de la instalación anterior y la nueva instalación nueva)

Y por favor cita tus caminos:

  • ExecWait '"$INSTDIR\uninstall.exe" /S _?=$INSTDIR'
  • RmDir /r /REBOOTOK "$INSTDIR\client"

contestado el 03 de mayo de 12 a las 12:05

Gracias por tu tiempo. Como señaló @Seki, el desinstalador estaba tratando de eliminarse a sí mismo: Delete /REBOOTOK $INSTDIR\uninstall.exe. Copié el programa de desinstalación en una ubicación temporal y lo ejecuté desde allí: ExecWait "$INSTDIR\temp\uninstall.exe /S _?=$INSTDIR". Para que espere y también pueda eliminar el desinstalador anterior en $INSTDIR. Y sí, estoy completamente de acuerdo en que REBOOTOK no es una buena idea aquí. Pero el problema es que el antiguo desinstalador ya se envió y no tenemos control sobre él. Eliminaré el interruptor REBOOTOK en la versión actual del instalador. - gshank

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.