正在通过NSIS安装应用程序。根据NSIS的要求,还提供了带有Uninstaller.dat
的卸载程序。
希望使用以下方法收集在卸载过程中要删除的所有文件:>
!insertmacro UNINSTALL.LOG_OPEN_INSTALL
!insertmacro UNINSTALL.LOG_CLOSE_INSTALL
两者均由AdvUninstLog
插件提供。但是,这显然是不可能的。如果计算机上已经存在卸载并且插件处于活动状态,则安装过程将开始花费荒谬的时间,即少于5-10分钟。这是因为插件的${Locate} "${TargetDir}" "/L=FD" "${UnLog_Install_Func_CallBack}"
调用开始无休止地在安装目录中搜索文件。我不清楚为什么会发生这种现象。我的怀疑是Uninstall.dat
包含不再存在的文件,并且已被用户删除,从而导致对该文件的长时间搜索。不过,我不确定。
尝试处理此问题
!insertmacro UNINSTALL.LOG_OPEN_INSTALL
和相应的结束呼叫。这将导致空Uninstall.dat
,因此卸载程序几乎变得无用。Uninstall.exe
是否存在,如果是,则假定目标文件夹中存在以前的安装,并省略!insertmacro UNINSTALL.LOG_OPEN_INSTALL
和相应的关闭调用。这工作得很好,但是在初始安装时只会收集所有文件一次。当用户通过现有安装进行安装时,作为更新的一部分添加的文件Uninstall.dat
中被识别。在安装过程中尝试编辑Uninstall.dat
。不可能,因为显然该文件是在安装程序节之前读取的,而在安装程序节之后写入的,所以一旦安装程序完成,我写给它的任何内容都将被擦除,nsisExec
在安装之前触发卸载。这是胡说八道,因为它会在安装程序窗口上方打开一个新的卸载程序窗口,并按照预期进行聚焦。这对用户来说简直太糟糕了,因为突然之间有两个安装窗口争夺他们的焦点。AdvUninstLog
,因为使用其宏可以完成卸载,并且这些宏仅对卸载部分有效。!insertmacro UNINSTALL.LOG_OPEN_INSTALL
?RMDir /r $path
,但这与没有RMDir
的/r
具有完全相同的效果,Uninstall.dat
保持最新状态的程序,但又可以防止AdvUninstLog
插件引起的冗长调用。我该如何实现?方案通过NSIS安装应用程序。根据NSIS的要求,还提供了带有Uninstaller.dat的卸载程序。希望收集所有要删除的文件...
类似于AdvUninstLog,卸载日志仅用于撤消已安装的文件和注册表项,尽管此标头要求您使用用于包装File,WriteRegStr等调用的宏。