2012-05-03 31 views
1

我有一个NSIS安装程序它调用卸载程序卸载旧版本。

ExecWait $INSTDIR\uninstall.exe /S _?=$INSTDIR_?开关用于使安装程序等待卸载完成。

确实在等待卸载完成。但是,当我重新启动我的机器时,uninstall.exe不存在于$INSTDIR下。

卸载程序部分具有使用/REBOOTOK开关删除$INSTDIR下的一些子目录的命令。

例:RmDir /r /REBOOTOK $INSTDIR\client

将对机器重启被移除这项事业UNINSTALL.EXE?

回答

0

关于部署卸载程序的部分,此ExecWait声明的位置是什么?

卸载程序可能会删除自己(或尝试),并且它与与自身删除方式相关的“新卸载程序”之间存在冲突:由于可执行文件在其执行过程中无法删除,标记为在下次启动时删除(如果使用/REBOOTOK选项)。在此之后,您正在部署“新的卸载程序”,如果它具有相同的名称,它将在下次启动时被删除。

您可以尝试使用VIAddVersionKey语句来为新安装程序定义与前者不同的版本。然后安装后,检查它是新的还是以前的unistaller。

如果您有一个HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\PendingFileRenameOperations multi_sz值,如果在下次引导时标记为删除,可能包含卸载程序的名称,那么还请查看注册表。

+0

感谢您的回复。你在现场。卸载程序会在卸载过程中尝试删除自己 - “Delete/REBOOTOK $ INSTDIR \ uninstall.exe”。它在运行时不能自行删除,因此它会在重新启动时清除新的卸载程序。再次感谢您指点我正确的方向! – gshank

+0

不客气:o)我刚刚编辑了历史记录的答案,因为我的意思是'CurrentControlSet'而不是'ControlSet001'(我的复制/粘贴失败),不过你得到它了。 – Seki

0

/REBOOTOK的全部要删除正在使用的文件。但RmDir /r /REBOOTOK $INSTDIR\client不应该删除$INSTDIR\uninstall.exe,你确定你没有RmDir /r /REBOOTOK $INSTDIR电话吗?

无论你如何看待它,在这里使用/ REBOOTOK可能都不是一个好主意。一旦用户重新启动在$ INSTDIR \客户端的所有文件将被删除(从旧的安装文件和新的重新安装)

并请注明您的路径:

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

谢谢你的时间。正如@Seki指出的,卸载程序试图删除自己 - “删除/ REBOOTOK $ INSTDIR \ uninstall.exe”。我将卸载程序复制到一个临时位置并从那里运行 - ExecWait“$ INSTDIR \ temp \ uninstall.exe/S _?= $ INSTDIR”'。这样它就可以等待,并且可以删除'$ INSTDIR'下的旧卸载程序。是的,我完全同意REBOOTOK在这里不是个好主意。但问题是,旧的卸载程序已经发货了,我们无法控制它。我将删除当前安装程序版本中的REBOOTOK开关。 – gshank