首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >等待NSIS卸载程序在NSIS安装程序中完成,或者失败,否则卸载程序不会被删除

问等待NSIS卸载程序在NSIS安装程序中完成,或者失败,否则卸载程序不会被删除
EN

Stack Overflow用户
提问于 2014-07-06 12:38:59
回答 1查看 5.3K关注 0票数 0

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

代码语言:javascript
复制
ExecWait '"$INSTDIR\uninstall.exe" _?=$INSTDIR'

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

代码语言:javascript
复制
Delete "$INSTDIR\uninstall.exe"

据我所知,uninstall.exe未被删除的原因是,当前正在执行的文件不能被删除。总结一下我的问题:

代码语言:javascript
复制
ExecWait '"$INSTDIR\uninstall.exe"'

不会等待卸载程序完成

代码语言:javascript
复制
ExecWait '"$INSTDIR\uninstall.exe" _?=$INSTDIR'

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-07-06 12:50:37

_?=参数告诉卸载程序,它应该而不是,将自己复制到%temp%并执行该副本,而无需等待它完成。_?=后的路径用于在卸载程序中初始化$InstDir。

在安装程序中,您可以这样做:

代码语言:javascript
复制
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'
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24595887

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档