【问题标题】:Copying files to different directory during WIX Upgrade在 WIX 升级期间将文件复制到不同的目录
【发布时间】:2016-05-07 05:36:16
【问题描述】:

我一直在为应用程序开发 WIX 安装程序,但升级的一小部分卡住了:安装目录中有两个 XML 配置文件,我想将它们复制到新的 ProgramData 目录中(因为它们会不在...\Program Files... 中)。

我尝试了几种解决方案,包括不同的括号/撇号/",但均无济于事。当我编译 WIX 安装程序时,我从 CANDLE 收到了几个关于包含 [CommonAppDataProduct][PRODUCTNAMEFOLDER] 的属性的警告,但我不确定是否需要从 Product.wxs 中定义的那些目录中对每个自定义进行一些引用/PropertyRef行动。

Product.wxs的片段:

<Product Id="*" Name="$(var.ProductName)" Language="0" Version="$(var.Version)" Manufacturer="$(var.Manufacturer)" UpgradeCode="$(var.UpgradeCode)">
<Package InstallerVersion="200" Compressed="yes" InstallScope="perMachine" />
<MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." />
<InstallExecuteSequence>
  <SelfUnregModules/>
  <SelfRegModules/>
  <Custom Action="CopyConfigFilesToTemp" After="InstallValidate" />
  <Custom Action="LaunchDPInstActionx86" Before="InstallFinalize">NOT Installed OR MaintenanceMode="Modify"</Custom>
  <Custom Action="CopyConfigFilesFromTemp" After="LaunchDPInstActionx86" />
</InstallExecuteSequence>
</Product>
...
<Fragment>
<Directory Id="$(var.PlatformProgramFilesFolder)">
      <Directory Id="PRODUCTNAMEFOLDER" Name="$(var.ProductName)"/>
</Directory>
</Fragment>

自定义操作 CopyConfigFilesToTemp

<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
    <Fragment>
        <Property Id="QuietExec2" Value='"xcopy.exe [PRODUCTNAMEFOLDER]*.xml" %TEMP% /I /Y'/>
        <CustomAction Id="CopyConfigFilesToTemp" BinaryKey="WixCA" DllEntry="WixQuietExec" Execute="immediate" Return="ignore"/>
    </Fragment>
</Wix>

自定义操作 CopyConfigFilesFromTemp

<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
    <Fragment>
        <Property Id="QuietExec3" Value='"xcopy.exe %TEMP%\*.xml [CommonAppDataProduct]" /I /Y /R'/>
        <CustomAction Id="CopyConfigFilesFromTemp" BinaryKey="WixCA" DllEntry="WixQuietExec" Execute="immediate" Return="ignore"/>
    </Fragment>
</Wix>

【问题讨论】:

  • 编译时得到的警告是什么?

标签: wix windows-installer custom-action


【解决方案1】:

这些自定义操作必须是延迟自定义操作,因为它们试图修改程序文件路径中需要提升权限的内容。在将文件复制到安装目录时,安装中唯一具有提升权限的部分是安装的服务器服务器部分。

如果您打算在操作中使用 msi 属性之一,则延迟的自定义操作对它们有特殊要求。

根据微软网站Deferred Actions

因为安装脚本可以在编写它的安装会话之外执行,所以在执行安装脚本期间会话可能不再存在。这意味着安装序列期间的原始会话句柄和属性数据集不可用于延迟执行自定义操作。

这实质上意味着您需要将属性的值放在一个特殊的位置,该位置在安装的提升部分发生时保证存在,并且必须以这样一种方式进行格式化,以便它确切知道在哪里寻找得到那个值。

因此,要运行这些操作,它们必须在 InstallInitialize 和 InstallFinalize 之间进行调度,并且还必须能够从特殊位置获取属性值。

要使用延迟自定义操作,您只需将执行更改为延迟执行,但是,我们必须添加此特殊属性和格式化值,以便您可以从自定义操作中获取 QuietExec 和 QuietExec2 的值。

您需要为每个延迟操作声明如下自定义操作:

<CustomAction Id="CustomActionNameHere" Property="CopyConfigFilesToTemp" Value="QuietExec2=&quot;xcopy.exe [PRODUCTNAMEFOLDER]*.xml&quot; %TEMP% /I /Y" />
<CustomAction Id="CustomActionNameHere" Property="CopyConfigFilesFromTemp" Value="QuietExec3=&quot;xcopy.exe %TEMP%\*.xml [CommonAppDataProduct]&quot; /I /Y /R" />

通常,我将它们称为与他们为其设置属性的自定义操作相同的名称,名称前缀为“Set”。 IE:SetCopyConfigFilesFromTemp 和 SetCopyConfigFilesToTemp,方便定位。

您还必须安排这些自定义操作,并且在他们为其设置属性并匹配条件的操作之前安排它们不会出错。

<Custom Action="SetCopyConfigFilesToTemp" Before="CopyConfigFilesToTemp">
<Custom Action="SetCopyConfigFilesFromTemp" Before="CopyConfigFilesFromTemp">

在自定义操作代码中,您需要使用session.CustomActionData["PropertyName"],而不仅仅是session["PropertyName"]

我还会考虑您想要运行这些复制命令的情况,因为我认为您在卸载产品或全新安装而不是升级时不想执行这些命令。

【讨论】:

  • 这个答案可能不适用于这个问题,但我还是把它留在这里。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-01
  • 1970-01-01
  • 2013-03-11
  • 1970-01-01
  • 2013-02-02
相关资源
最近更新 更多