我一直在为一个应用程序开发一个WIX安装程序,并且只停留在升级的一小部分上:安装目录中有两个XML配置文件,我想将它们复制到新的ProgramData目录中(因为它们会不要...... \程序文件......继续前进。)
我尝试了几种解决方案,包括不同的括号/撇号/ "
,但无济于事。当我编译WIX安装程序时,我收到来自CANDLE的关于包含[CommonAppDataProduct]
和[PRODUCTNAMEFOLDER]
的属性的几个警告,但我不确定是否需要从Product中定义的那些目录中获得一些reference / PropertyRef。 wxs到每个自定义操作。
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>
答案 0 :(得分:1)
这些自定义操作必须是延迟的自定义操作,因为他们正在尝试修改程序文件路径中需要提升权限的内容。安装中具有提升权限的唯一部分是安装时将文件复制到安装目录时的服务器服务器部分。
如果您打算在操作中使用其中一个msi属性,则延迟的自定义操作对它们有特殊要求。
根据微软的Deferred Actions
网站由于安装脚本可以在编写安装会话的安装会话之外执行,因此在执行安装脚本期间可能不再存在会话。这意味着在安装过程中设置的原始会话句柄和属性数据不适用于延迟执行自定义操作。
这实际上意味着您需要将属性的值放在保证在安装的提升部分发生时保证存在的特殊位置,并且必须以确切地知道在哪里查找的方式进行格式化得到那个价值。
因此,要运行这些操作,必须在InstallInitialize和InstallFinalize之间安排它们,并且还必须能够从特殊位置获取属性值。
要使用延迟自定义操作,您只需将执行更改为延迟,但是,我们必须使用格式化值添加此特殊属性,以便您可以从自定义操作中获取QuietExec和QuietExec2的值。
您需要为每个延期操作声明一个自定义操作:
<CustomAction Id="CustomActionNameHere" Property="CopyConfigFilesToTemp" Value="QuietExec2="xcopy.exe [PRODUCTNAMEFOLDER]*.xml" %TEMP% /I /Y" />
<CustomAction Id="CustomActionNameHere" Property="CopyConfigFilesFromTemp" Value="QuietExec3="xcopy.exe %TEMP%\*.xml [CommonAppDataProduct]" /I /Y /R" />
通常我称这些名称与他们为&#34; Set&#34;设置属性的自定义操作相同。前缀为名称。 IE:SetCopyConfigFilesFromTemp和SetCopyConfigFilesToTemp,以便它们易于定位。
您还必须安排这些自定义操作,并且在他们为其设置属性并匹配条件的操作之前,您可能会错误地安排这些操作。
<Custom Action="SetCopyConfigFilesToTemp" Before="CopyConfigFilesToTemp">
<Custom Action="SetCopyConfigFilesFromTemp" Before="CopyConfigFilesFromTemp">
在自定义操作代码中,您需要使用session.CustomActionData["PropertyName"]
而不仅仅是session["PropertyName"]
我还会考虑您想要运行这些复制命令的情况,因为我不认为您在卸载产品时想要执行这些操作,或者它是全新安装而不是升级。