Wix 被动、基本用户界面和未安装用户界面上的MSI属性为空

Wix 被动、基本用户界面和未安装用户界面上的MSI属性为空,wix,windows-installer,Wix,Windows Installer,我正在使用一个安装程序执行一些自定义操作,以查找以下MSI属性中的值: ADDLOCAL 添加默认值 重新安装 除去 在使用完整UI运行安装程序时,这些属性包含逗号分隔的功能名称列表(根据用户选择的选项而定)。但是,当我在被动模式下运行安装程序或从命令行仅使用基本UI(或没有UI)时,我发现属性为空/空白。只有当我从命令行显式设置它们时,它们才有任何值。这是一个可以接受的解决方法,但是如果这些可以采用某种默认值,比如“all”,而不需要在命令行上传递值,那就更好了。有没有什么方法可以在WiX

我正在使用一个安装程序执行一些自定义操作,以查找以下MSI属性中的值:

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

我已经查看了属性引用,但没有看到任何关于如何为这些属性指定默认特性的内容

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

<>我运行Wix3.5.2519,并使用VisualStudio 2010使用VisualC++进行自定义操作代码。谢谢你能给我的任何帮助

编辑:

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

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

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

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


然后,您可以通过编程或在命令行上更改默认值,如下所述:。

您的自定义操作可能不应该检查这些属性。相反,他们应该检查产品的功能和/或组件状态,这取决于他们试图做什么。在中,这看起来像是
$component action
&feature action
(您使用您试图针对其操作设置条件的组件或功能的名称)。在C++中(对于自定义操作来说),这看起来像或是,当然,在大多数其他语言中,这些代码当然是可用的(如<代码>会话。我试图避免在命令行上更改属性,因为这很容易出错,所以我认为编程方法就是我想要的。你能给我举个例子吗?我已经浏览了您参考的MSDN页面,但运气不好。我对安装程序和WiX还很陌生。为了详细说明我的评论,我确实在提供的链接中看到了MsiGetProperty和MsiSetProperty的示例,但我不清楚在调用自定义操作之前如何在属性表中设置属性的默认值(因为我使用WiX创建了安装程序)。好的,它一直盯着我的脸:再次感谢你!我还应该提到,同时指定ADDLOCAL=ALL和REMOVE=ALL可能不是您想要的。我不是WiX用户,所以我不能说如何使用该工具来实现这一点,但如果您已经在使用它来创建安装程序,那么这可能是最好的方法。另一个选项是创建自定义转换,MSDN上有一个示例:。这是为不同用户启用基本包安装不同功能的常用方法。我打开详细日志记录(/l*v开关)进行卸载,发现:属性更改:添加删除属性。其值为“FeatureName”。几行之后我看到了这一点:属性更改:修改移除属性。其当前值为“FeatureName”。它的新价值是“全部”。为什么会发生这种情况?我也发现了:“命令行:REMOVE=FeatureName REBOOTPROMPT=S REMOVE=ALL CURRENTDIRECTORY=C:\CLIENTUILEVEL=2 CLIENTPROCESSID=4132”。我没有两次通过移除财产;是不是有些默认的东西在我不知道的情况下添加了这个?发现了:事实证明,除了空字符串之外,我真的不想给这些特定属性设置默认值,因为如果它们都已定义,它们可能会相互冲突(例如,它将安装,然后立即卸载)!在静默卸载过程中,要找到指定删除目标的正确方法似乎还有很长的路要走,要说“默认安装所有内容”并让我的自定义操作知道这一点并不是一件容易的事,尽管我还没有完全了解转换。在静默卸载过程中,所有内容都被卸载。这就是卸载的目的。因此msi正确设置
REMOVE=ALL
。如果您只需要卸载某些功能(可能还需要安装一些其他功能),您可以在安装模式下运行
/i
,并将
删除
属性设置为要删除的功能列表(以及
将本地
添加到要添加/安装的列表)。我说可能是因为如果您的操作安排得足够早,组件和功能状态尚未确定,属性是您唯一的选择。这似乎是检查这些状态的更好方法