代码之家  ›  专栏  ›  技术社区  ›  Wim Coenen

如何在安装MSI时以编程方式检测成功或失败?

  •  4
  • Wim Coenen  · 技术社区  · 15 年前

    我有一个引导程序应用程序,它安装了几个MSI包。但是,如果安装失败,Windows Installer似乎不会返回任何错误代码。例如,如果我点击“取消”,以下命令行测试不会打印“失败”:

    msiexec /i myinstaller.msi || echo failed
    

    鉴于缺乏错误反馈,检测安装故障的最佳方法是什么?


    正如被接受的答案所表明的,实际上返回了一个错误代码。出于某种原因,我的测试用例在从批处理文件执行时只能按预期工作,而不是直接在命令行键入。
    4 回复  |  直到 7 年前
        1
  •  4
  •   Heinzi    15 年前

    事实上, msiexec 返回错误代码,两个成功代码分别为0(成功)和3010(成功,需要重新启动)。也许cmd.exe在您的示例中有一些不需要的魔力(比如在msiexec完成之前返回),但我通过vbscript成功地读取了msiexec错误代码。 WScript.Shell Run (bWaitOnReturn=真)。

    尝试在test.vbs文件中引发以下内容,然后使用 cscript test.vbs :

    Set WshShell = WScript.CreateObject("WScript.Shell")
    MsgBox(WshShell.Run("msiexec /i myinstaller.msi", , true))
    

    如果单击“取消”,它将弹出一个非零值。

        2
  •  4
  •   eduardomozart Philipp Kewisch    7 年前

    自从Windows Installer 1.0首次发布以来,msiexec.exe始终 在Windows子系统中运行。这意味着当它从 控制台或通过批处理脚本控件返回控制台或 立即编写脚本。如果你依靠 %ERRORLEVEL% 变量是 相应地进行设置。

    在这个场景中,我喜欢使用 start /wait 从命令行或 批处理脚本。这将创建进程并等待它退出, 流程返回的代码被传递并返回 从启动命令开始,这样 %ErrReal% 相应设置。只是 类型 开始/等待 在命令行之前,您通常要传递给 msiexec.exe,如以下示例中所示:

    start /wait msiexec.exe /i netfx.msi /l*v netfx.log

    批处理脚本将被阻止,直到msiexec.exe完成。 以编程方式,这与使用 创建进程并等待用 WaitForSingleObject没有超时。

    来源: https://blogs.msdn.microsoft.com/heaths/2005/11/15/waiting-for-msiexec-exe-to-finish/

    样例代码:

    start /wait msiexec.exe /i netfx.msi /l*v netfx.log
    
    if "%errorlevel%" == "0" goto OK
    if "%errorlevel%" == "1013" goto err
    if "%errorlevel%" == "1603" goto err
    if not "%errorlevel%" == "0" goto err
    
    :OK
    GOTO END
    
    :err
    rem print message and return errorlevel so package errors
    echo "Error: Msiexec failed with errorlevel = %errorlevel%"
    exit /b %errorlevel%
    
    :END
    

    代码参考: https://www.computing.net/answers/windows-xp/batch-file-to-install-msi-and-check-errorlvl/178657.html

        3
  •  3
  •   Donald Gray    13 年前

    如果单击“取消”,则不是一个错误,安装程序正在执行请求的操作,很可能会将0返回到“取消”功能。

        4
  •  1
  •   Jeff Paquette    15 年前

    MsiExcel return an error 安装失败时。要捕获用户取消,您可能需要使用 MIF file .