带有WPF引导程序的WIX安装程序未设置%ERRORLEVEL%变量

时间:2018-09-14 13:54:27

标签: c# .net wpf wix windows-installer

我有一个用WIX编写的安装程序,它具有WPF引导程序。最近,我们添加了静默安装模式,我们需要使用返回码来指定静默安装过程中发生的错误类型,例如:无效的用户名或密码,错误的服务器地址,不支持的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%设置为自定义值,如果可以,该怎么做?

1 个答案:

答案 0 :(得分:0)

%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

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