使用NSIS,我想在安装新版本之前从我的安装程序中调用以前安装的版本的卸载程序。此操作的拟议解决方案是执行以下命令:
ExecWait '"$INSTDIR\uninstall.exe" _?=$INSTDIR'据我所知,需要_?=$INSTDIR才能使ExecWait真正等待。没有它,NSIS将将卸载程序复制到临时目录,在那里启动它,然后在卸载程序完成之前返回。此解决方案的问题是,卸载程序直接在$INSTDIR中执行。这会导致卸载程序中的以下命令失败:
Delete "$INSTDIR\uninstall.exe"据我所知,uninstall.exe未被删除的原因是,当前正在执行的文件不能被删除。总结一下我的问题:
ExecWait '"$INSTDIR\uninstall.exe"'不会等待卸载程序完成
ExecWait '"$INSTDIR\uninstall.exe" _?=$INSTDIR'不允许卸载程序删除自身。有谁知道,如何等待卸载程序完成,同时允许卸载程序在卸载过程中立即删除自己?
发布于 2014-07-06 12:50:37
_?=参数告诉卸载程序,它应该而不是,将自己复制到%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'https://stackoverflow.com/questions/24595887
复制相似问题