使用NSIS,我想在安装新版本之前从我的安装程序调用以前安装的版本的卸载程序。 proposed solution用于执行以下命令:
ExecWait '"$INSTDIR\uninstall.exe" _?=$INSTDIR'
据我所知,需要_?=$INSTDIR
才能使ExecWait
真正等待。没有它,NSIS会将卸载程序复制到临时目录,在那里启动它,然后在卸载程序完成之前返回。此解决方案的问题是,卸载程序直接在$ INSTDIR中执行。这会导致卸载程序中的以下命令失败:
Delete "$INSTDIR\uninstall.exe"
据我所知,uninstall.exe
未删除的原因是,无法删除当前正在执行的文件。总结一下我的问题:
ExecWait '"$INSTDIR\uninstall.exe"'
不等待卸载程序完成并
ExecWait '"$INSTDIR\uninstall.exe" _?=$INSTDIR'
不允许卸载程序自行删除。有没有人知道,如何等待卸载程序完成,同时允许卸载程序在卸载过程中立即删除自己?
答案 0 :(得分:3)
_?=
参数告诉卸载程序它应不将自身复制到%temp%
并执行该副本而不等待它完成。 _?=
之后的路径用于在卸载程序中初始化$ InstDir。
在您的安装程序中,您可以执行以下操作:
InitPluginsDir
;ReadRegStr $oldinstall ... ; Somehow detect old install
CreateDirectory "$pluginsdir\unold" ; Make sure plugins do not conflict with a old uninstaller
CopyFiles /SILENT /FILESONLY "$oldinstall\uninst.exe" "$pluginsdir\unold"
ExecWait '"$pluginsdir\unold\uninst.exe" _?=$oldinstall'