Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
NSIS?=$INSTDIR开关打开ExecWait将在重新启动时删除卸载程序.exe_Nsis - Fatal编程技术网

NSIS?=$INSTDIR开关打开ExecWait将在重新启动时删除卸载程序.exe

NSIS?=$INSTDIR开关打开ExecWait将在重新启动时删除卸载程序.exe,nsis,Nsis,我有一个NSIS安装程序,它调用卸载程序卸载旧版本 ExecWait$INSTDIR\uninstall.exe/S?=$INSTDIR。开关用于使安装程序等待卸载完成 它确实会等待卸载完成。但是当我重新启动计算机时,uninstall.exe在$INSTDIR下不存在 卸载程序部分有命令,可以使用/REBOOTOK开关删除$INSTDIR下的一些子目录 示例:RmDir/r/REBOOTOK$INSTDIR\client 这会导致在机器重新启动时删除uninstall.exe吗?删除正在使用的

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

ExecWait
$INSTDIR\uninstall.exe/S?=$INSTDIR
开关用于使安装程序等待卸载完成

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

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

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


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

删除正在使用的文件的整个/REBOOTOK点。但是
RmDir/r/REBOOTOK$INSTDIR\client
不应该删除
$INSTDIR\uninstall.exe
,您确定那里没有
RmDir/r/REBOOTOK$INSTDIR
调用吗

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

请引用您的路径:

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

关于部署卸载程序的部分,此
ExecWait
语句的位置是什么

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

您可以尝试使用
viadVersionKey
语句为新安装程序定义不同于前者的版本。安装后,检查是新的还是旧的


如果您有一个
HKEY\U LOCAL\U MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\PendingFileRenameOperations
multi\u sz值,该值可能包含卸载程序的名称(如果在下次启动时标记为删除)。

感谢您的响应。你说得对。卸载程序在卸载期间尝试删除自身-
delete/REBOOTOK$INSTDIR\uninstall.exe
。它无法在运行时删除自身,因此会在重新启动时清除新的卸载程序。再次感谢你为我指明了正确的方向!不客气:o)我只是出于历史目的编辑了我的答案,因为我的意思是
CurrentControlSet
,而不是
ControlSet001
(我复制/粘贴失败),但你还是得到了答案。谢谢你的时间。正如@Seki所指出的,卸载程序正在尝试删除自身-
delete/REBOOTOK$INSTDIR\uninstall.exe
。我将卸载程序复制到一个临时位置并从那里运行它-
ExecWait“$INSTDIR\temp\uninstall.exe/S”\ux?=$INSTDIR”
。这样它就可以等待,并且可以在
$INSTDIR
下删除旧的卸载程序。是的,我完全同意REBOOTOK在这里不是个好主意。但问题是,旧的卸载程序已经发布,我们无法控制它。我将在当前安装程序版本中删除REBOOTOK开关。