在 NSIS 安装程序中等待 NSIS 卸载程序完成失败或卸载程序不会被删除

hon*_*onk 0 installation nsis uninstallation

使用 NSIS,我想在安装新版本之前从安装程序中调用以前安装的版本的卸载程序。建议的解决方案是执行以下命令:

ExecWait '"$INSTDIR\uninstall.exe" _?=$INSTDIR'
Run Code Online (Sandbox Code Playgroud)

据我了解,_?=$INSTDIR需要ExecWait真正的等待。如果没有它,NSIS 会将卸载程序复制到临时目录,并在那里启动它,然后在卸载程序完成之前返回。此解决方案的问题是,卸载程序直接在 $INSTDIR 中执行。这导致我的卸载程序中的以下命令失败:

Delete "$INSTDIR\uninstall.exe"
Run Code Online (Sandbox Code Playgroud)

据我了解,uninstall.exe不删除的原因是当前正在执行的文件无法删除。总结一下我的问题:

ExecWait '"$INSTDIR\uninstall.exe"'
Run Code Online (Sandbox Code Playgroud)

不等待卸载程序完成

ExecWait '"$INSTDIR\uninstall.exe" _?=$INSTDIR'
Run Code Online (Sandbox Code Playgroud)

不允许卸载程序删除自身。有谁知道如何等待卸载程序完成,同时允许卸载程序在卸载过程中立即删除自身?

And*_*ers 5

_?=参数告诉卸载程序不应将自身复制到%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'
Run Code Online (Sandbox Code Playgroud)