首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >我如何让NSIS在msi上等待?

我如何让NSIS在msi上等待?
EN

Stack Overflow用户
提问于 2017-08-09 19:43:10
回答 1查看 791关注 0票数 0

我正在NSIS的安装程序上工作,我正在寻找一种方法来启动msi安装程序,并在继续之前等待该安装程序完成。我已经研究了我所能做的各种方法,但没有运气。无论我如何尝试,msi都会启动,但在msi安装程序完成之前,NSIS脚本就会继续进行(更具体地说,正如我所了解的,msi很快就完成了,但是启动了自己独立的安装程序exe,NSIS脚本不会等待)。

代码摘录,包括我尝试过的许多不同方法中的几个。

代码语言:javascript
运行
复制
# 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
  • start /wait行甚至不运行msi文件,可能是因为语法错误。
  • msi文件的ExecWait行工作并打开msi文件,但不会等待。
  • 将ExecWait更改为ExecDos::exec并添加Pop $0和ExecDos::wait $0对于我需要安装的exe安装程序来说工作得很好,而对msi安装程序则不然。
  • 如果我尝试在msi文件启动的ExecWait上运行MySQLInstaller.exe,我会收到一个对话框错误框,通知这个exe的两个副本不能同时运行(我在这里直接执行它,msi也在执行它)。
  • 我试图寻找一个简单地等待而不是执行的命令,但是我找不到一个。我确实找到了一个很有希望的想法,即创建一个循环,查找程序运行并在程序存在时退出,但在这两个循环中只立即返回0。
  • 我试过WaitProcStart和WaitProcEnd,但是他们什么也不做。不幸的是,FindProcDLL的NSIS插件页面说,从NSIS2.46开始,插件甚至不再工作了,所以我可能做了一个徒劳无功的尝试(循环也是如此)。
  • 我尝试了nsProcess版本的查找进程,因为这看起来像是FindProcDLL的替代品,但也不起作用。

作为参考,我正在Windows 10 64位机器上开发和交付,我使用的是NSISv3.01。

EN

回答 1

Stack Overflow用户

发布于 2017-08-09 20:00:48

Exec 'start /wait ...'永远不会工作,即使您将它更改为ExecWait,它仍然无法工作,因为start是Windows系统上cmd.exe内部的一个内部命令。

为了澄清问题,ExecWait总是在等待,但它只是等待子进程,而不是孙子。使用作业对象可以等待孙子,但MSI使用的不是孙辈的Windows,因此作业对象可能不会在这里帮助您。

任何类型的查找进程插件都不能工作,因为一个.MSI文件不是PE可执行文件,它只是一个数据库,或者是一些CAB压缩文件。

正确的解决方案是使用ExecWait,但您必须要求切换到MSIExec和/或他们的安装程序.EXE的MySQL人员.

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45599373

复制
相关文章

相似问题

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