我有一个引导程序应用程序,它安装了几个MSI软件包。但是,如果安装失败,似乎Windows安装程序不会返回任何错误代码。例如,如果我按下“取消”,则以下命令行测试不会打印“失败”:
msiexec /i myinstaller.msi || echo failed
Run Code Online (Sandbox Code Playgroud)
鉴于缺少错误反馈,检测安装故障的最佳方法是什么?
实际上,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)
如果您点击“取消”,它应该会弹出一个非零值。
自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
| 归档时间: |
|
| 查看次数: |
5074 次 |
| 最近记录: |