简体   繁体   English

如何让NSIS等待MSI?

[英]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
  • The start /wait line doesn't even run the msi file, possibly due to errors in syntax. start / wait行甚至没有运行msi文件,这可能是由于语法错误造成的。
  • The ExecWait line for the msi file works and opens the msi file, but doesn't wait. msi文件的ExecWait行可以工作并打开msi文件,但不等待。
  • Changing ExecWait to ExecDos::exec and adding in the Pop $0 and ExecDos::wait $0 works just fine for the exe installers I need to install but not for the msi installer. 将ExecWait更改为ExecDos :: exec并添加Pop $ 0和ExecDos :: wait $ 0对于需要安装的exe安装程序很好,但对于msi安装程序却没有问题。
  • If I try and run ExecWait on the MySQLInstaller.exe that the msi file starts up, I get a dialog error box informing that two copies of this exe can't run at the same time (I'm executing it directly here and the msi is also executing it). 如果我尝试在运行MySQLInstaller.exe的ExecWait上运行msi文件,则会收到一个对话框错误消息,通知该exe的两个副本不能同时运行(我在这里直接执行它,而msi也正在执行它)。
  • I tried looking for a command that simply waits instead of executes and waits but I couldn't find one. 我试图寻找一条仅等待而不是执行然后等待的命令,但找不到。 I did find someone's promising idea of making a loop that looks for the program running and exits out when it's done existing, but that only returns 0 immediately in both loops. 我确实找到了一个很有希望的想法,那就是创建一个循环,该循环查找正在运行的程序,并在程序完成后退出,但是在两个循环中都只立即返回0。
  • I've tried the WaitProcStart and WaitProcEnd but those don't do anything. 我已经尝试过WaitProcStart和WaitProcEnd,但是它们什么也没做。 Unfortunately, the NSIS plugin page for FindProcDLL says that as of NSIS 2.46 the plug in doesn't even work anymore, so I was probably making a futile attempt (same for the loops). 不幸的是,FindProcDLL的NSIS插件页面说,从NSIS 2.46开始,该插件甚至不再起作用,所以我可能正在徒劳地尝试(与循环相同)。
  • I tried the nsProcess version of finding a process because that looked to be the replacement for FindProcDLL, but that doesn't work either. 我尝试了找到进程的nsProcess版本,因为它看起来是FindProcDLL的替代品,但是那也不起作用。

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 . 只是为了ExecWaitExecWait总是等待,但只等待子进程,而不是孙子进程。 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM