在 Wix 安装程序脚本中有条件地设置快捷方式参数

Conditionally set shortcut arguments in wix installer script

我有以下WIX快捷方式。

 <!--Desktop shortcuts-->
  <Directory Id="DesktopFolder" Name="Desktop">
    <Component Id="CMP_DesktopShortcuts" Guid="{guidblah}">
      <Shortcut Id="Shotcut_Editor_Desktop"
                Name ="Software"
                Description="Software Description"
                Arguments="$(var.CmdLineArgs)"
                Target="blah.exe">
      </Shortcut>

      <RegistryValue Root="HKCU"
                      Key="Software\blah"
                      Name="DesktopShortcutInstalled"
                      Type="integer"
                      Value="1"
                      KeyPath="yes"
      />
    </Component>
  </Directory>

我根据正在构建的安装程序在我的构建脚本中设置了 CmdLineArgs。我的构建脚本之一没有命令行参数,因此将 CmdLineArgs 设置为 null。

然后我得到这个错误:

error CNDL0006: The Shortcut/@Arguments attribute's value cannot be an empty string. If a value is not required, simply remove the entire attribute.

如何仅在 $(var.CmdLineArgs) 不为空时有条件地设置参数?

使用 preprocessor 有条件地编译一个 Shortcut 元素,有或没有 Arguments 属性取决于变量。

<?ifdef CmdLineArgs?>
    <Shortcut Id="Shotcut_Editor_Desktop"
            Name ="Software"
            Description="Software Description"
            Arguments="$(var.CmdLineArgs)"
            Target="blah.exe">
    </Shortcut>
<?else?>
    <Shortcut Id="Shotcut_Editor_Desktop"
            Name ="Software"
            Description="Software Description"
            Target="blah.exe">
    </Shortcut>
<?endif?>

不幸的是这里有一些重复,因为预处理器条件不能应用于属性级别,元素是最小的粒度。

以下为无效 XML:

<Shortcut Id="Shotcut_Editor_Desktop"
        Name ="Software"
        Description="Software Description"
    <?ifdef CmdLineArgs?>
        Arguments="$(var.CmdLineArgs)"
    <?endif?>
        Target="blah.exe">
</Shortcut>

您也可以通过对其他属性使用预处理器变量来消除一些重复,例如。 g.:

<?ifdef CmdLineArgs?>
    <Shortcut Id="Shotcut_Editor_Desktop"
            Name ="$(var.ProductName)"
            Description="$(var.ProductDescription)"
            Arguments="$(var.CmdLineArgs)"
            Target="$(var.ProductExeFile)">
    </Shortcut>
<?else?>
    <Shortcut Id="Shotcut_Editor_Desktop"
            Name ="$(var.ProductName)"
            Description="$(var.ProductDescription)"
            Target="$(var.ProductExeFile)">
    </Shortcut>
<?endif?>

Id 属性不太可能更改,因此我将其保留原样以提高可读性。