我有 NSIS安装程序,它会调用卸载程序来卸载旧版本。
ExecWait $INSTDIR\uninstall.exe /S _?=$INSTDIR
。 _?
开关用于使安装程序等到卸载完成。
它确实等到卸载完成。但是当我重新启动计算机时,uninstall.exe
下没有$INSTDIR
。
卸载程序部分包含使用$INSTDIR
开关删除/REBOOTOK
下的某些子目录的命令。
例如:RmDir /r /REBOOTOK $INSTDIR\client
这是否会导致在机器重启时删除uninstall.exe?
答案 0 :(得分:0)
/ 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"
答案 1 :(得分:0)
关于部署卸载程序的部分,此ExecWait
语句的位置是什么?
卸载程序可能会自行删除(或尝试)并且它与“新卸载程序”之间存在冲突,这与它自行删除的方式有关:因为执行程序在执行过程中无法删除,而是标记本身在下次启动时删除(如果使用/REBOOTOK
选项)。之后,您正在部署“新的卸载程序”,如果它具有相同的名称,则会在后续引导时将其删除。
您可以尝试使用VIAddVersionKey
语句来定义与前者不同的新安装程序的版本。然后安装后,检查它是新的还是前的unistaller。
如果您有一个HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\PendingFileRenameOperations
multi_sz值,可以包含卸载程序的名称(如果在下次启动时标记为删除),请查看注册表。