【问题标题】:How do I programmatically detect success or failure when installing an MSI?安装 MSI 时如何以编程方式检测成功或失败?
【发布时间】:2009-11-10 14:46:49
【问题描述】:

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

msiexec /i myinstaller.msi || echo failed

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


正如公认的答案所暗示的那样,实际上返回了一个错误代码。出于某种原因,我的测试用例仅在从批处理文件执行时才能按预期工作,而不是直接在命令行中键入。

【问题讨论】:

  • +1 用于解释为什么您的测试用例不起作用。
  • 您的测试用例和批处理文件都需要使用call msiexec || echo failed。 (死灵,fwiw 等 :)

标签: windows-installer


【解决方案1】:

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

在这种情况下,我喜欢在命令行中使用 start /wait 或 批处理脚本。这将创建进程并等待它退出, 并且进程的返回码被传递并返回 从 start 命令开始,以便相应地设置 %ERRORLEVEL%。只是 在你通常传递给的命令行之前输入start /wait msiexec.exe 如下例所示:

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

然后,批处理脚本将被阻止,直到 msiexec.exe 完成。 以编程方式,这与调用 msiexec.exe 没有什么不同 CreateProcess 并等待进程句柄发出信号 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

【讨论】:

    【解决方案2】:

    其实msiexec确实返回错误码,两个成功码分别是0(成功)和3010(成功,需要重启)。也许 cmd.exe 在你的例子中做了一些不需要的魔法(比如在 msiexec 完成之前返回),但是当我通过 VBScript 的WScript.Shell Run(bWaitOnReturn = True)执行它时,我成功地读取了 msiexec 错误代码。

    尝试将以下内容放入 test.vbs 文件中,然后使用 cscript test.vbs 执行它:

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

    如果你点击取消,它应该会弹出一个非零值。

    【讨论】:

      【解决方案3】:

      如果您点击取消,这不是错误,安装程序正在执行请求的操作,并且很可能将 0 返回到取消函数。

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-08-11
          • 2014-08-24
          • 2021-05-27
          • 1970-01-01
          • 1970-01-01
          • 2010-12-14
          • 1970-01-01
          相关资源
          最近更新 更多