关于 wix:如何在自定义引导程序应用程序中设置或获取所有日志

How to set or get all logs in a custom bootstrapper application

在我的自定义 Burn 托管引导程序应用程序中,我想要一种方法来设置安装程序的默认日志目录,以便客户可以轻松找到安装日志。如果无法做到这一点,我想要一种合适的方式在安装后复制日志文件。

我尝试在我的设置项目(即 Bundle.wxs)和我的托管引导程序应用程序中设置 WixBundleLog 变量,但没有成功。此外,我的引导程序应用程序足够通用,因此可以与各种产品/安装包一起使用,因此我需要一个足够灵活的解决方案来设置/获取每个包的安装日志,而无需对包名称进行硬编码在我的引导程序应用程序中。

似乎应该有一种方法可以做到这一点,而无需强制用户在命令行上使用 "-l" 或 "-log"。


WixBundleLog 是指定日志文件的刻录变量。无法在包中覆盖它,因为您无法在包含"Wix"前缀的包中设置变量。在引导程序应用程序中覆盖它也不起作用,因为引导程序继续记录到其默认值。

烧录引导程序为引导程序日志和安装包日志设置字符串变量。我在列表中跟踪这些变量。所以在我的构造函数中我有类似的东西:

1
2
3
this.LogsDirectory = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.CommonDocuments), @"Company_Name\\Logs\\Installer", DateTime.Now.ToString("yyyyMMdd_hhmmss"));
_logVariables = new List<string>();
_logVariables.Add("WixBundleLog");

Burn 以 [WixBundleLog]_PackageId 格式为日志文件设置字符串变量。
在触发 PlanPackageComplete 事件时,在我的引导程序应用程序中,我有一个事件处理程序,其中包含以下代码以将变量添加到我的列表中。

1
2
3
//set *possible* log variables for a given package
_logVariables.Add("WixBundleLog_" + e.PackageId);
_logVariables.Add("WixBundleRollbackLog_" + e.PackageId);

在安装结束或我的引导程序遇到错误时,我调用以下方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
private void CopyLogs()
{
     if (!Directory.Exists(this.LogsDirectory))
         Directory.CreateDirectory(this.LogsDirectory);

     foreach (string logVariable in _logVariables)
     {
         if (this.Bootstrapper.Engine.StringVariables.Contains(logVariable))
         {
             string file = this.Bootstrapper.Engine.StringVariables[logVariable];
             if (File.Exists(file))
             {
                 FileInfo fileInfo = new FileInfo(file);
                 fileInfo.CopyTo(Path.Combine(this.LogsDirectory, fileInfo.Name), false);
             }
         }
     }
 }