MSI安装程序中的ADDLOCAL = FEATURE1删除其他功能

时间:2018-05-18 11:43:26

标签: wix windows-installer

我正在尝试使用安装程序(1.0)上的wix安装程序setup.exe(2.0)安装FEATURE_NEW之一 setup.exe / v / qn ADDLOCAL = FEATURE_NEW

它安装了FEATURE_NEW,但问题是,它删除了其他功能FEATURE1,FEATURE2等。

我希望现有功能应该升级并安装新的FEATURE_NEW,不应安装其他功能。

所以我的问题是我可以使用之前安装的功能列表'N'安装/升级产品加上新添加的功能,即N + NEW_FEATURES。 我正在寻找类似的东西,

setup.exe / v / qn ADDLOCAL = INSTALLED_FEATURES,FEATURE_NEW

2 个答案:

答案 0 :(得分:1)

第2轮

MigrateFeatureStates :我发现您已更新了问题。看起来你正在处理功能。我假设您使用的是从版本1到版本2的主要升级?首先,标准MSI行动MigrateFeatureStates将尝试"保留"主要升级的功能安装状态 - 如果在Upgrade table(属性列)中将主要升级配置为执行此操作,只需提及它。

功能属性 :换句话说,如果您设置任何要素属性(ADDLOCAL,{{3} },ADDSOURCEREMOVE等等,然后您的新版本应该继承您的第一个版本的功能结构并且至关重要地自动安装任何新功能(前提是他们设置为默认安装。)

MSI API :基于此,我不确定您是否需要添加某项功能,但可能是您的功能 < / strong>默认设置为安装。如上所述,我不知道通过命令行检索当前功能状态的方法(可能有一个),但您可以使用ADVERTISE然后通过MSI API或命令行调用新安装(或其他一些方式)。

功能操作 :我有一个过时的VBScript我可以快速适应生成msiexec.exe命令行以进行功能状态操作,但在进入之前它应该请注意,您可以使用的MSI包中控制功能选择:MSI API 实质上您可以使用自定义操作随意操作功能选择。您可以详细检查系统以确定应安装哪些功能,而不是。您还可以使用功能条件来影响功能选择,而无需一行代码(无自定义操作)。请参阅上面的链接答案(推荐)。还有一节关于&#34; MSI功能&#34;在这个试图解释它的答案中:How to install feature based on the property set in custom action?

GUI功能操作 :我还想补充一点,如果您的GUI包含自定义对话框屏幕,您可以明显更改MSI GUI中的功能状态即将在系统上安装的功能。

摘要 :总而言之,您可以通过MSI中的功能条件自定义操作来操作功能 - 您还可以让用户在GUI中以交互方式手动更改功能。如果这还不够,您可以使用MSI API检索已安装的MSI的功能状态,如下面的VBScript所示。该脚本生成的是一个命令行代码段,它将复制已安装的功能状态,并在脚本的指定位置添加任何内容。您需要输入要获得功能状态的MSI的产品代码: Wix Installer : Setting component condition property when doing a MSIEXEC admin install at command line (只需从MSI的属性表或从您的WiX源获取它 - 该链接仅供参考)。该脚本默认为获取可能出现在您的盒子上的公共运行时包的功能状态。

我想这会产生一些现实世界的选择:

  1. 依靠MigrateFeatureStates在版本2中添加任何新功能。默认情况下,必须将新功能设置为安装。
  2. 通过自定义操作或功能条件设置要素属性。
  3. 使用MSI API检索当前安装的功能状态,并通过msiexec.exe安装新版本,并使用自定义命令行设置功能属性。
  4. 让用户在GUI中以交互方式添加他们需要的功能。
  5. 无论我忘记了什么。
  6. 很容易扩展此脚本以报告所有已安装的MSI包的所有功能状态(实际上,在我对其进行调整之前,该脚本已经执行了此操作)。

    On Error Resume Next
    
    Public cmdline
    
    ' Sample Product Codes:
      ' Microsoft Visual C++ 2008 Redistributable - x86 9.0.30729.17: {9A25302D-30C0-39D9-BD6F-21E6EC160475}
    
    productcode = InputBox("ProductCode for your MSI:", "ProductCode:","{9A25302D-30C0-39D9-BD6F-21E6EC160475}")
    If productcode = vbCancel Or Trim(productcode) = "" Then
       WScript.Quit(0)
    End If
    
    ' Arrays of current feature states
    ReDim ADDLOCAL(-1), ADDSOURCE(-1), ADVERTISE(-1), REMOVE(-1)
    
    Set installer = CreateObject("WindowsInstaller.Installer")
    Set productfeatures = installer.Features(productcode)
    If (Err.number <> 0) Then
       MsgBox "Failed to open MSI package. Invalid product code?", vbCritical, "Fatal error. Aborting:"
       WScript.Quit(2)
    End If
    
    ' Spin over all product features detecting installation states
    For Each feature In productfeatures
    
        featurestate = installer.FeatureState(productcode, feature)
    
        ' Using crazy VBScript arrays
        Select Case featurestate
           Case 1 ReDim Preserve ADVERTISE(UBound(ADVERTISE) + 1) : ADVERTISE(UBound(ADVERTISE)) = feature
           Case 2 ReDim Preserve REMOVE(UBound(REMOVE) + 1) : REMOVE(UBound(REMOVE)) = feature
           Case 3 ReDim Preserve ADDLOCAL(UBound(ADDLOCAL) + 1) : ADDLOCAL(UBound(ADDLOCAL)) = feature
           Case 4 ReDim Preserve ADDSOURCE(UBound(ADDSOURCE) + 1) : ADDSOURCE(UBound(ADDSOURCE)) = feature
           Case Else ' Errorstate MsgBox "Error for feature: " + feature
        End Select
    
    Next
    
    ' Now add whatever feature you need to ADDLOCAL, here is just a sample:
    ReDim Preserve ADDLOCAL(UBound(ADDLOCAL) + 1) : ADDLOCAL(UBound(ADDLOCAL)) = "MyNewFeature"
    
    ' Flatten arrays
    If UBound(ADDLOCAL) > -1 Then cmdline = chr(34) + "ADDLOCAL=" + Join(ADDLOCAL, ",") + chr(34)
    If UBound(REMOVE) > -1 Then cmdline = cmdline + + " " + chr(34) + "REMOVE=" + Join(REMOVE, ",") + chr(34)
    If UBound(ADVERTISE) > -1 Then cmdline = cmdline + + " " + chr(34) + "ADVERTISE=" + Join(ADVERTISE, ",") + chr(34)
    If UBound(ADDSOURCE) > -1 Then cmdline = cmdline + + " " + chr(34) + "ADDSOURCE=" + Join(ADDSOURCE, ",") + chr(34)
    
    ' Your current feature installstate translated to msiexec.exe command line parameters
    Wscript.Echo cmdline ' MsgBox has 1024 character limit
    

    第1轮

    功能 :如果您要检索当前安装的产品功能安装状态(功能是用户可选择的安装部分:ProgramDictionariesSDKHelpTutorials等等,然后可以通过How can I find the product GUID of an installed MSI setup?实现。我不熟悉通过msiexec.exe命令行检索功能安装状态的方法。

    组件 :如果您指的是MSI组件(分配给用户可选功能的安装程序的原子位,但用户从未直接看到) ),那么我并不完全明白你想要实现的目标。 ADDLOCALthe MSI API之一,它仅影响功能安装状态,它只会间接影响组件(分配给您引用的功能的组件)。

    重大升级 :我想知道您是否未实施适当的重大升级,而这是您遇到的真正问题。请更新您的问题以获取更多信息。正确实施的主要升级将安装任何新组件,删除过时的组件并安装您添加的任何新功能。在我再写之前,请澄清你的问题。

    我有一个VBScript,它将检索您指定的产品的当前功能状态(或者对于所有已安装的MSI文件)。如果那确实是你想要的。

答案 1 :(得分:1)

如果您正在执行ADDLOCAL,那么您将明确列出要安装的功能 - 已安装的功能是您指定的功能。它不是增量的,也不代表&#34;还安装这些功能&#34;。例如,它会关闭功能条件。如果要在使用引导程序进行主要升级期间添加功能,可以使用MsiEumFeatures()来获取已添加新功能列表的已安装功能列表。另一种方法是使用自定义操作来解析在MigrateFeatureStates之后排序的ADDLOCAL字符串,并将新的字符串添加到列表中。