【问题标题】:NSIS _?=$INSTDIR switch on ExecWait removes the uninstaller.exe on rebootExecWait 上的 NSIS _?=$INSTDIR 开关会在重新启动时删除卸载程序.exe
【发布时间】:2012-05-03 10:17:14
【问题描述】:

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

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

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

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

例如:RmDir /r /REBOOTOK $INSTDIR\client

这会导致uninstall.exe 在机器重新启动时被删除吗?

【问题讨论】:

    标签: nsis


    【解决方案1】:

    这个ExecWait 声明在部署卸载程序的部分中的位置是什么?

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

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

    如果您有一个 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\PendingFileRenameOperations multi_sz 值,如果它被标记为在下次启动期间删除,则还要查看注册表,该值可能包含您的卸载程序的名称。

    【讨论】:

    • 感谢您的回复。你很准。卸载程序在卸载过程中尝试删除自身 - Delete /REBOOTOK $INSTDIR\uninstall.exe。它在运行时无法自行删除,因此它会在重新启动时清除新的卸载程序。再次感谢您为我指明正确的方向!
    • 不客气 :o) 我只是出于历史目的编辑了我的答案,因为我的意思是 CurrentControlSet 而不是 ControlSet001(我的复制/粘贴失败)但你还是明白了。跨度>
    【解决方案2】:

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

    无论您怎么看,在这里使用 /REBOOTOK 都可能不是一个好主意。用户重启后,$INSTDIR\client 中的所有文件都将被删除(旧安装和全新安装的文件)

    请引用你的路径:

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

    【讨论】:

    • 感谢您的宝贵时间。正如@Seki 指出的那样,卸载程序试图删除自己-Delete /REBOOTOK $INSTDIR\uninstall.exe。我将卸载程序复制到一个临时位置并从那里运行它 - ExecWait "$INSTDIR\temp\uninstall.exe /S _?=$INSTDIR"。这样它就可以等待并且能够删除$INSTDIR 下的旧卸载程序。是的,我完全同意 REBOOTOK 在这里不是一个好主意。但问题是,旧的卸载程序已经发货,我们无法控制它。我将删除当前安装程序版本中的 REBOOTOK 开关。
    猜你喜欢
    • 2013-02-10
    • 1970-01-01
    • 2012-09-07
    • 2015-12-13
    • 2014-09-27
    • 2013-02-20
    • 2014-09-13
    • 1970-01-01
    • 2014-08-27
    相关资源
    最近更新 更多