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

Wim*_*nen 4 windows-installer

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

msiexec /i myinstaller.msi || echo failed
Run Code Online (Sandbox Code Playgroud)

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


如已接受的答案所示,实际上会返回错误代码。由于某种原因,我的测试用例只能在从批处理文件执行时按预期方式工作,而不是直接在命令行中键入。

Hei*_*nzi 5

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

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

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

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


jay*_*red 5

自Windows Installer 1.0首次发布以来,msiexec.exe始终在Windows子系统中运行。这意味着,当从控制台或通过批处理脚本执行脚本时,控件将立即返回到控制台或脚本。如果您依赖于相应%ERRORLEVEL%设置的变量,则不会。

在这种情况下,我想start /wait从命令行或批处理脚本中使用。这将创建进程并等待其退出,然后将进程的返回代码传递到start命令并从start命令返回,从而%ERRORLEVEL%进行相应设置。只需start /wait在通常传递给msiexec.exe的命令行之前键入,如以下示例所示:

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

然后,将阻止批处理脚本,直到msiexec.exe完成。以编程方式,这与使用CreateProcess调用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
Run Code Online (Sandbox Code Playgroud)

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