【问题标题】:Add WiX Custom Action to copy MSI log file to LOCALAPPDATA folder添加 WiX 自定义操作以将 MSI 日志文件复制到 LOCALAPPDATA 文件夹
【发布时间】:2014-03-26 01:52:10
【问题描述】:

我如何创作一个 WiX 自定义操作

  1. 总是在安装结束时调用,至少在出现安装错误时调用
  2. 将当前 MSI 日志文件从其当前本地复制到用户的 APPDATA 文件夹

我有这个托管的自定义操作代码。不确定如何在我的 Wix 脚本中编写它的调用。是否应该在 InstallFinalize 之后安排自定义操作?可以安排 OnExit="error" 吗?

    [CustomAction]
    public static void CopyLogFile(Session session)
    {
        const string company = "MyCompany";
        const string product = "MyProduct";
        try
        {
            session.Log("CustomAction.CopyLogFile entry");

            var msiLogFilePath = session.CustomActionData["LOGFILEPATH"];
            if (msiLogFilePath != null)
            {
                session.Log("CustomAction.CopyLogFile MSI log filename: {0}", msiLogFilePath);

                var localAppDataPath = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData);
                var destDirPath = Path.Combine(localAppDataPath, company, product);

                var destDir = Directory.CreateDirectory(destDirPath);
                session.Log("CustomAction.CopyLogFile Destination directory: {0}", destDir.FullName);

                var destFilePath = Path.Combine(destDir.FullName, Path.GetFileName(msiLogFilePath));
                File.Copy(msiLogFilePath, destFilePath, true);

                session.Log("CustomAction.CopyLogFile Log file copied to: {0}", destFilePath);
            }
            else
            {
                session.Log("CustomAction.CopyLogFile File path not found");
            }
        }
        catch (Exception exception)
        {
            session.Log("CustomAction.CopyLogFile exception {0}", exception);
        }
        finally
        {
            if (session != null)
            {
                session.Log("CustomAction.CopyLogFile exit");
                session.Close();
            }
        }
    }

【问题讨论】:

    标签: c# wix windows-installer custom-action


    【解决方案1】:

    是的,您可以在 InstallFinalize 之后安排它(我也是,但如果不是完全删除包,我每次都复制它):

    <InstallExecuteSequence>
        <Custom Action="CopyLogfile" After="InstallFinalize">NOT (REMOVE="ALL" AND NOT UPGRADINGPRODUCTCODE)</Custom>
    </InstallExecuteSequence>
    

    如果有的话,记得将它添加到 UI 序列中。我将它作为事件添加到 SetupCompleteSuccess- 和 SetupCompleteError- 对话框中的 PushButton(也许您只需要将它添加到后一个?),如下所示:

    <Dialog Id="SetupCompleteSuccess" X="50" Y="50" Width="374" Height="266" Title="[ProductName]" NoMinimize="yes">
         <Control Id="OK" Type="PushButton" X="230" Y="243" Width="66" Height="17" Text="&amp;Finish" TabSkip="no" Default="yes" Cancel="yes">
               <Publish Event="EndDialog" Value="Exit">1</Publish>
               <!-- ### Invoking copying the logfile if the Finish-button is pressed -->
               <Publish Event="DoAction" Value="CopyLogfile">MsiLogFileLocation AND NOT (REMOVE="ALL" AND NOT UPGRADINGPRODUCTCODE)</Publish>
        </Control>
     <!-- ... rest of the dialog ... -->
    </Dialog>
    

    关于仅在出现错误时显示它:也许检查ProductState-properrty?在网上搜索了这个,但没有找到任何有用的东西。

    编辑:也许只有在发生错误时才执行它的正确方法是使用仅在回滚期间执行它的自定义操作标志。在 WiX 中,它是 Execute="rollback"-tag 的 CustomAction-attribute。

    【讨论】:

    • 如何启动 MSI?最好先在用户的 appdata 文件夹中创建日志,然后在安装成功时将其删除。其实,反正我是不会删的。您假设成功与“没有问题”相同。如果文件没有得到更新,CA 没有运行等,你将需要日志!
    • @PhilDW 我们没有启动 MSI 的引导程序 - 因此我们无法使用“msiexec /l*vx install.log /i myprogram.msi”调用来启动它。安装程序在完成后重新启动机器。这通常会导致 %TEMP% 文件夹被清除。由于我们无法更改日志位置,因此我想将日志文件复制到持久文件夹中。将尝试此处建议的解决方案。
    • MsiLogging 属性怎么样?:msdn.microsoft.com/en-us/library/aa370322(v=vs.85).aspx。不过我从来没有尝试过。
    • 我想他正在使用这个属性,因为我无法想象如何做到这一点。然后将日志文件写入 MsiLogFileLocation 属性中指定的文件。但是,后者是只读的,如果在命令行上没有给出位置,则以 MSIxxxx.log 作为名称(其中 xxxx 是随机字符)写入 %TEMP% 目录。因此,在安装结束时,我们可以准确复制 MsiLogFileLocation-property 中指定的文件。
    【解决方案2】:

    如果您能提供帮助,请不要在 InstallFinalize 之后使用自定义操作。通过 SCCM、Unicenter 等工具进行部署时,它们通常会被完全跳过...

    一个带有按钮的自定义对话框可以在安装结束时打开日志文件。

    【讨论】:

    • Here 你可以找到这样做的说明。
    • 我不清楚是否可以让 CA 在 UAC 系统上工作。如果您将 CA 放在 InstallFinalize 之后,那么它必须是即时的,因此不会被提升,它将以安装用户的凭据作为受限用户运行,并且可能无法访问您要使用的位置。跨度>
    • True Phil,但我认为他只是想打开日志文件,并且我认为他会将其置于至少具有读取能力的位置。在我看来,立即模式自定义操作可以改变系统的整个概念应该从 MSI 中完全消除 - 即使作为管理员,它们也应该以只读权限运行。
    • 有时一个不太好的解决方案总比没有解决方案好。在我的客户用例中,我很高兴将 99% 的安装/维修/升级中的日志文件放在预定义的文件夹中,其他脚本可以在其中获取它们。不是一个好的解决方案,也许它有异味,但它确实有效。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多