为什么[ProductCode]可以在[ProductName]不能的时候进行expaneded?

时间:2017-05-04 02:33:35

标签: wix

我有这样的WiX代码:

<DirectoryRef Id="MyShortcutsDir">
    <Component Id="CMP_StartMenuShortcuts" Guid="62A9F5D2-F9D9-4F9B-8382-D470E11B2332">
        <Shortcut Id="docEng" Name="UFCOM user guide - ENG (pdf)" Target="[INSTALLFOLDER]UFCOM user guide - ENG.pdf" />
        <Shortcut Id="docChs" Name="UFCOM user guide - CHS (pdf)" Target="[INSTALLFOLDER]UFCOM user guide - CHS.pdf" />
        <Shortcut Id="UninstallShortcut" Name="Uninstall [ProductName] ~ [ProductVersion]" Target="[System64Folder]msiexec.exe" Arguments="/x [ProductCode]" Description="Remove UFCOM from your Windows" />
        <RemoveFolder Id="RemoveMyShortcutsDir" On="uninstall" />
        <RegistryValue Root="HKCU" Key="Software\Newland Auto-ID\UFCOM" Name="installed" Type="integer" Value="1" KeyPath="yes" />
        <!-- On Win7, these shortcuts(.lnk) resides in "C:\ProgramData\Microsoft\Windows\Start Menu\Programs\UFCOM" -->
    </Component>
</DirectoryRef>

但是我发现[ProductCode]可以在[ProductName]不能的时候出现,为什么会这样呢?那么如何在元素中引用产品名称定义?

<Product Id="*" Name="UFCOM Driver 1.3.6" ... >
</Product>

Code screen shot ProductName is not expanded, damn

2 个答案:

答案 0 :(得分:7)

方括号中的属性名称仅由MSI安装程序针对MSI数据库中Formatted列类型中的数据进行扩展。安装产品时会发生扩展。

在MSI数据库的Shortcut表中:

  • Arguments 列的类型为Formatted,因此在安装产品时会展开[ProductCode]
  • 名称列的类型为Filename,因此在安装产品时不会展开[ProductName][ProductVersion]

您可以使用WIX属性,这些属性在WIX构建过程中展开。例如:

<?define ProductName='My Product Name' ?>
<?define ProductVersion='X.Y.Z' ?>

<Shortcut Id="UninstallShortcut" 
     Name="Uninstall $(var.ProductName) ~ $(var.ProductVersion)" 
     Target="[System64Folder]msiexec.exe" 
     Arguments="/x [ProductCode]" 
     Description="Remove UFCOM from your Windows" />

答案 1 :(得分:2)

括号中的属性在“格式化”属性中展开。对于快捷方式,Shortcut table定义了Arguments的格式,但Name不是。

您可以定义变量

  <?define MyProductName = "UFCOM Driver 1.3.6" ?>

然后在Product / @ Name和Shortcut / @ Name:

中使用它
<Product Name="$(var.MyProductName)"

<Shortcut Name="Uninstall $(var.MyProductName)"