[英]How do I get NSIS to wait on an msi?
I'm working on an installer in NSIS and I'm looking for a way to start an msi installer and wait for that installer to finish before proceeding. 我正在NSIS中安装程序,正在寻找一种方法来启动msi安装程序,并等待该安装程序完成后再继续。 I've researched everything I can on various ways to do this with no luck.
我已经以各种方式研究了一切可以做到的事,但是没有运气。 Regardless of any manner I try, the msi starts up but then the NSIS script proceeds immediately before the msi installer is finished (more specifically, as I've learned, the msi finishes quickly but starts up its own separate installer exe that the NSIS script won't wait on).
无论我尝试哪种方式,MSI都会启动,但是NSIS脚本会在MSI安装程序完成之前立即进行(更具体地,据我所知,MSI会快速完成,但是会启动它自己的独立安装程序EXE,即NSIS脚本不会等待)。
Code excerpt, including a few of the many different methodologies I've tried commented out. 代码摘录,包括我尝试注释掉的许多不同方法中的一些。
# Include files
!include x64.nsh
!include nsdialogs.nsh
!include LogicLib.nsh
!include MUI2.nsh
!include WinVer.nsh
!include nsDialogs_userData.nsh
!include StrFunc.nsh
!include nsDialogs_createIPaddress.nsh
!include nsProcess.nsh
!include WordFunc.nsh
!include WinMessages.nsh
!include FileFunc.nsh
Function MYSQL_SERVER_INSTALLATION
;Exec 'start /wait "msiexec.exe" /i "$INSTDIR\mysql-installer-community-5.7.13.0.msi"'
ExecWait '"msiexec.exe" /i "$INSTDIR\mysql-installer-community-5.7.13.0.msi"'
;Pop $0
;ExecDos::wait $0
#The mySQL msi opens up MySQLInstaller.exe. That's the real program to wait on.
;ExecWait '"$PROGRAMFILES\MySQL\MySQL Installer for Windows\MySQLInstaller.exe" /s'
MSILoop:
FindProcDLL::FindProc "$INSTDIR\mysql-installer-community-5.7.13.0.msi"
StrCmp $R0 0 0 +2
MessageBox MB_OK "The number is $R0 meaning $INSTDIR\mysql-installer-community-5.7.13.0.msi is not found."
Goto MySQLInstallerLoop
StrCmp $R0 1 0 +2
MessageBox MB_OK "The number is $R0 meaning $INSTDIR\mysql-installer-community-5.7.13.0.msi is found."
Goto MSILoop
MySQLInstallerLoop:
FindProcDLL::FindProc "$PROGRAMFILES\MySQL\MySQL Installer for Windows\MySQLInstaller.exe"
StrCmp $R0 0 0 +2
MessageBox MB_OK "The number is $R0 meaning $PROGRAMFILES\MySQL\MySQL Installer for Windows\MySQLInstaller.exe is not found."
Goto ConfigureDatabase
StrCmp $R0 1 0 +2
MessageBox MB_OK "The number is $R0 meaning $PROGRAMFILES\MySQL\MySQL Installer for Windows\MySQLInstaller.exe is found."
Goto MySQLInstallerLoop
; FindProcDLL::WaitProcStart "$PROGRAMFILES\MySQL\MySQL Installer for Windows\MySQLInstaller.exe" 500
; FindProcDLL::WaitProcEnd "$PROGRAMFILES\MySQL\MySQL Installer for Windows\MySQLInstaller.exe" -1
ConfigureDatabase:
# Configure the MySQL Community
!insertmacro ConfigureMySQLDatabase
!insertmacro CreateMySQLMCSTDatabases
# Delete the MySQL Community installation
SetOutPath "$INSTDIR"
Delete /REBOOTOK "$INSTDIR\mysql-installer-community-${MYSQL_VERSION}.msi"
FunctionEnd
For reference, I am both developing and delivering on a Windows 10 64-bit machine and I'm using NSIS v3.01. 作为参考,我正在Windows 10 64位计算机上进行开发和交付,并且正在使用NSIS v3.01。
Exec 'start /wait ...'
is never going to work and even if you change it to ExecWait
it is still not going to work because start
is an internal command inside cmd.exe on Windows NT systems. Exec 'start /wait ...'
永远不会起作用,即使将其更改为ExecWait
它也仍然无法起作用,因为start
是Windows NT系统上cmd.exe内部的内部命令。
Just to set things straight, ExecWait
always waits but it only waits for the child process, not grandchildren . 只是为了
ExecWait
, ExecWait
总是等待,但只等待子进程,而不是孙子进程。 It is possible to use a job object to wait for grandchildren but MSI uses a Windows service that is not a grandchild so a job object is probably not going to help you here. 可以使用作业对象来等待孙子,但是MSI使用的不是Windows的Windows服务,因此作业对象可能不会在这里为您提供帮助。
Any type of find process plug-in is not going to work because a .MSI file is not a PE executable, it is just a database and maybe some CAB compressed files. 任何类型的查找过程插件都无法使用,因为.MSI文件不是PE可执行文件,它只是一个数据库,也许还有一些CAB压缩文件。
The correct solution is to use ExecWait
but you have to ask the MySQL people which switches to pass to MSIExec and/or their installer .EXE... 正确的解决方案是使用
ExecWait
但是您必须询问要切换到MSIExec和/或其安装程序.EXE的MySQL人员。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.