带WPF引导程序的WIX Installer未设置%ERRORLEVEL%变量

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了带WPF引导程序的WIX Installer未设置%ERRORLEVEL%变量相关的知识,希望对你有一定的参考价值。

我有一个用WIX编写的安装程序,它有一个WPF Bootstrapper。最近我们添加了静默安装模式,我们需要使用返回代码来指定静默安装期间发生的错误类型,例如:无效的用户名或密码,不正确的服务器地址,不支持的Windows版本等。

我们使用Bootstrapper类的Engine.Quit()方法退出安装程序并使用退出代码。可以在安装程序日志中看到此退出代码:

[5490:4F84][2018-09-14T14:31:03]i007: Exit code: 0x101, restarting: No

但是,当我检查%errorlevel%环境变量时,它保持不变。使用Environment.Exit()也没有帮助。

我怀疑,MSI可能会通过覆盖WIX尝试设置的内容来对此类行为负责,但即使在安装程序的某个操作中强制ActionResult.Failure也无济于事。 MSI退出代码位于MSI日志中,但%errorlevel%保持不变:

MSI (c) (AC:9C) [14:30:59:133]: MainEngineThread is returning 1603
=== Verbose logging stopped: 2018-09-14  14:30:59 ===

是否可以使WIX将%errorlevel%设置为自定义值,如果是,可以如何进行?

答案

%ERROPRLEVEL%值是您在批处理文件环境(Windows cmd BAT shell,以及PowerShell,我相信)中获得的一项功能,因此您不会在脚本批处理环境之外看到该值。如果您的静默安装是批处理脚本,则从您的帖子中不清楚。

话虽如此,MSI安装过程会返回此处记录的标准Windows错误结果:

https://docs.microsoft.com/en-us/windows/desktop/Msi/error-codes

所以他们无法定制。您提到的特定错误(例如无效的用户名或无效的服务器地址)似乎是MSI中自定义操作代码的错误。人们通常使用Windows Installer的日志记录功能将消息添加到标准日志文件中,从而处理自定义操作中的错误诊断。这使用MsiProcessMessage()或等效的方法:

https://social.msdn.microsoft.com/Forums/windows/en-US/5698aaee-11e5-4a8c-b307-f96b9eb1884f/writing-custom-messages-to-log-file-of-msi-using-msiprocessmessage?forum=winformssetup

https://docs.microsoft.com/en-us/windows/desktop/msi/sending-messages-to-windows-installer-using-msiprocessmessage

因此,除非您安排在日志中记录详细信息(如上所述),或者将它们放在静默安装可以看到它们的位置(注册表?),否则您不会得到特定于自定义操作的错误。

以上是关于带WPF引导程序的WIX Installer未设置%ERRORLEVEL%变量的主要内容,如果未能解决你的问题,请参考以下文章

Wix3.7 自定义引导程序不显示主题库中的 WPF 主题

Wix 托管引导程序应用程序:通过捆绑将变量传递给 msi

如何设置 Wix 引导程序安装的产品代码

WiX 引导程序项目参考变量

WiX - 将参数从 MSI 传递到 Xeam 引导程序应用程序

WiX 引导程序的示例应用程序(检查 .NET Framework 和 SQL Server 2005/2008)