3

我正在开发一个安装程序,其中包含一些在以下 MSI 属性中查找值的自定义操作:

  • 添加本地
  • 添加默认
  • 重新安装
  • 消除

使用完整 UI 运行安装程序时,这些属性包含逗号分隔的功能名称列表(根据用户选择的选项而定)。但是,当我以被动模式运行安装程序或从命令行仅使用基本 UI(或没有 UI)时,我发现属性为空/空白。只有当我从命令行显式设置它们时,它们才具有任何价值。这是一个可以接受的解决方法,但如果这些可以采用某种默认值(例如“all”)而不需要在命令行上传递值,那就更好了。有什么方法可以在 WiX(我用来构建 MSI)中指定它,还是我必须在自定义操作代码中做一些事情(或完全其他事情)?

我在这里查看了属性参考,但我没有看到任何关于如何为这些属性指定默认功能的提及。

我还发现有趣的是,如果我在安装过程中以这种方式在命令行上指定一个功能,它似乎存储在 REMOVE 属性中以供卸载(换句话说,我在卸载时不必传递任何参数)模式)。这是我可以依赖的功能吗?如果以后有人修改安装,它会自动更新吗?

我正在运行 WiX 3.5.2519 并将 Visual Studio 2010 与 Visual C++ 一起用于自定义操作代码。感谢你给与我的帮助!

编辑:

其实,我错了。在其中一种模式下卸载和运行时,即使我在命令行上传递了不同的值或只安装了一部分功能,REMOVE 属性似乎总是​​设置为“全部”。这似乎坏了。我在这里做错了吗?

C:\> msiexec REMOVE=FeatureName /passive /l* uninstall.log /x Product.msi

它将完全忽略我为“FeatureName”指定的内容,并在其位置使用“all”。

4

2 回答 2

4

您的自定义操作可能不应该检查这些属性。相反,他们应该检查产品的功能和/或组件状态,这取决于他们想要做什么。在条件语句语法中,这看起来像$component-action&feature-action(您使用组件或功能的名称,您尝试对其操作进行条件处理)。在 C++ 中(用于自定义操作),这看起来像MsiGetFeatureStateor MsiGetComponentState,当然,这些在大多数其他语言中通过类似的方式提供(例如session.FeatureRequestState/session.ComponentRequestState在您不应该使用的语言中)。

于 2012-10-24T12:00:21.717 回答
0

建议将安装使用的所有属性都输入到属性表中并带有初始值。安装程序在安装启动时将属性设置为这些值。空白是可接受的值的属性和安装程序中内置的属性不需要初始化。

然后,您可以通过编程方式或在命令行上更改默认值,如下所述:使用属性

于 2012-10-23T17:54:12.387 回答