处理NSIS Uninstall.dat和AdvUninstLog插件

问题描述 投票:0回答:1

场景

正在通过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,因为使用其宏可以完成卸载,并且这些宏仅对卸载部分有效。
  • 问题
    1. 为什么首先要永远使用!insertmacro UNINSTALL.LOG_OPEN_INSTALL
    2. 解决此问题的适当方法是什么?

  • 我尝试使用RMDir /r $path,但这与没有RMDir/r具有完全相同的效果,
  • 文件夹被删除,但是只有一次为空。那里发生了什么?自2004年以来就有线程描述这些问题,下面是一些示例:

    方案通过NSIS安装应用程序。根据NSIS的要求,还提供了带有Uninstaller.dat的卸载程序。希望收集所有要删除的文件...

    installer nsis uninstaller
    1个回答
    0
    投票
    我更喜欢另一个标头使用的方法(并且AdvUninstLog页面也提到了此方法):https://nsis.sourceforge.io/Uninstall_only_installed_files

    类似于AdvUninstLog,卸载日志仅用于撤消已安装的文件和注册表项,尽管此标头要求您使用用于包装File,WriteRegStr等调用的宏。

    © www.soinside.com 2019 - 2024. All rights reserved.