MSI 安装程序中的 ADDLOCAL=FEATURE1 删除了其他功能
ADDLOCAL=FEATURE1 in MSI installer removes other FEATURES
我正在尝试在 setup.exe(1.0) 之上使用 wix 安装程序 setup.exe(2.0) 安装 FEATURE_NEW 之一
setup.exe /v /qn ADDLOCAL=FEATURE_NEW
它安装 FEATURE_NEW,但问题是,它删除了其他功能 FEATURE1、FEATURE2 等
我希望现有功能应该升级并安装新的 FEATURE_NEW,不应安装其他功能。
所以我的问题是我可以 Install/upgrade 具有先前安装的功能列表 'N' 的产品加上新添加的功能,即 N + NEW_FEATURES。
我正在搜索
setup.exe /v /qn ADDLOCAL=INSTALLED_FEATURES,FEATURE_NEW
第二轮:
MigrateFeatureStates:我看到您已经更新了您的问题。看起来您正在处理功能。我假设您正在使用从版本 1 到版本 2 的重大升级?首先是标准的MSI动作MigrateFeatureStates
will try to "preserve" the feature installation state for major upgrades - if the major upgrade is configured to do so in the Upgrade table(属性栏),顺便提一下。
特征属性:换句话说,如果您不设置任何特征属性(ADDLOCAL
, ADDSOURCE
, REMOVE
, ADVERTISE
,等等...),然后你的新版本应该继承你第一个版本的功能结构,并且重要的是自动安装任何新功能(前提是它们被设置为安装默认情况下)。
MSI API:基于此,我不确定您是否有必要添加特定功能,但是如果您的功能 而不是 设置为默认安装,则可能是这样。如前所述,我不知道通过命令行检索当前功能状态的方法(可能有一个),但您可以使用 MSI API 然后通过 MSI API 调用新安装或命令行(或其他方式)。
特征操作:我有一个过时的 VBScript 我可以快速适应生成 msiexec.exe
特征状态操作的命令行, 但在开始之前应该提到的是,您可以使用 在 MSI 包中的多种机制来控制功能选择: In essence you can use a custom action to manipulate feature selection at will. You can inspect the system in detail to determine what features should be installed and not. You can also use feature conditions to affect feature selection without a single line of code (no custom action). See the linked answer just above (recommended). There is also a section on "MSI Features" in this answer which tries to explain it: Wix Installer : Setting component condition property when doing a MSIEXEC admin install at command line
GUI 功能操作:我还想补充一点,如果您的 GUI 包括自定义对话框屏幕,您可以在其中查看系统上即将安装的功能。
Summary: 所以总而言之你可以通过feature conditions and 自定义操作 来自您的 MSI - 您还可以让用户在 GUI 中以交互方式和手动方式 更改功能选择。如果这还不够,您可以使用 MSI API 检索已安装 MSI 的功能状态,如下面的 VBScript 所示。该脚本生成的是一个命令行片段,它将复制已安装的功能状态,以及您在脚本的指定位置添加的任何内容。您需要输入要获取以下功能状态的 MSI 的产品代码: (只需从 属性 table您的 MSI 或您的 WiX 源 - link 仅供参考)。该脚本默认获取可能出现在您的盒子上的常见运行时包的功能状态。
我想这会产生一些现实世界的选择:
- 依靠 MigrateFeatureStates 在版本 2 中添加任何新功能。新功能必须设置为默认安装。
- 通过自定义操作或功能条件设置功能属性。
- 使用 MSI API 检索当前安装的功能状态并通过 msiexec.exe 使用自定义命令行设置功能属性安装新版本。
- 让用户在 GUI 中以交互方式添加他们需要的功能。
- 我忘记了什么。
很容易扩展此脚本以报告所有已安装的 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 轮:
Features:如果要检索当前安装的产品的功能安装状态 (特征是用户选择table 安装部分:Program
、Dictionaries
、SDK
、Help
、Tutorials
、等等...)那么这可以通过 the MSI API 实现。我不熟悉通过 msiexec.exe
命令行检索功能安装状态的方法。
组件:如果您指的是 MSI 组件(分配给用户选择的安装程序的原子位 table 功能,但用户从未直接看到过),那么我不完全理解您要实现的目标。 ADDLOCAL
是 Feature Installation Options Properties 之一,它只影响功能安装状态,它只会间接影响组件(那些分配给您所指功能的组件)。
重大升级:我想知道您是否没有实施适当的重大升级,这才是您真正的问题所在体验。请使用更多信息更新您的问题。正确实施的主要升级将安装任何新组件,删除过时的组件,并安装您添加的任何新功能。在我写更多之前,请澄清你的问题。
我有一个 VBScript 可以检索您指定的产品(或所有已安装的 MSI 文件)的当前功能状态。如果那确实是你所追求的。
如果您正在执行 ADDLOCAL,那么您就是在明确列出要安装的功能 - 安装的功能是您指定的。它不是增量的,并不意味着"also install these features"。例如,它关闭特征条件。如果您想在使用引导程序进行重大升级期间添加功能,您可以使用 MsiEumFeatures() 来获取已安装的功能列表,您可以将新功能添加到该列表中。另一种方法是使用自定义操作来解析 ADDLOCAL 字符串,在 MigrateFeatureStates 之后排序,并将新的添加到列表中。
我正在尝试在 setup.exe(1.0) 之上使用 wix 安装程序 setup.exe(2.0) 安装 FEATURE_NEW 之一 setup.exe /v /qn ADDLOCAL=FEATURE_NEW
它安装 FEATURE_NEW,但问题是,它删除了其他功能 FEATURE1、FEATURE2 等
我希望现有功能应该升级并安装新的 FEATURE_NEW,不应安装其他功能。
所以我的问题是我可以 Install/upgrade 具有先前安装的功能列表 'N' 的产品加上新添加的功能,即 N + NEW_FEATURES。 我正在搜索
setup.exe /v /qn ADDLOCAL=INSTALLED_FEATURES,FEATURE_NEW
第二轮:
MigrateFeatureStates:我看到您已经更新了您的问题。看起来您正在处理功能。我假设您正在使用从版本 1 到版本 2 的重大升级?首先是标准的MSI动作MigrateFeatureStates
will try to "preserve" the feature installation state for major upgrades - if the major upgrade is configured to do so in the Upgrade table(属性栏),顺便提一下。
特征属性:换句话说,如果您不设置任何特征属性(ADDLOCAL
, ADDSOURCE
, REMOVE
, ADVERTISE
,等等...),然后你的新版本应该继承你第一个版本的功能结构,并且重要的是自动安装任何新功能(前提是它们被设置为安装默认情况下)。
MSI API:基于此,我不确定您是否有必要添加特定功能,但是如果您的功能 而不是 设置为默认安装,则可能是这样。如前所述,我不知道通过命令行检索当前功能状态的方法(可能有一个),但您可以使用 MSI API 然后通过 MSI API 调用新安装或命令行(或其他方式)。
特征操作:我有一个过时的 VBScript 我可以快速适应生成 msiexec.exe
特征状态操作的命令行, 但在开始之前应该提到的是,您可以使用 在 MSI 包中的多种机制来控制功能选择:
GUI 功能操作:我还想补充一点,如果您的 GUI 包括自定义对话框屏幕,您可以在其中查看系统上即将安装的功能。
Summary: 所以总而言之你可以通过feature conditions and 自定义操作 来自您的 MSI - 您还可以让用户在 GUI 中以交互方式和手动方式 更改功能选择。如果这还不够,您可以使用 MSI API 检索已安装 MSI 的功能状态,如下面的 VBScript 所示。该脚本生成的是一个命令行片段,它将复制已安装的功能状态,以及您在脚本的指定位置添加的任何内容。您需要输入要获取以下功能状态的 MSI 的产品代码:
我想这会产生一些现实世界的选择:
- 依靠 MigrateFeatureStates 在版本 2 中添加任何新功能。新功能必须设置为默认安装。
- 通过自定义操作或功能条件设置功能属性。
- 使用 MSI API 检索当前安装的功能状态并通过 msiexec.exe 使用自定义命令行设置功能属性安装新版本。
- 让用户在 GUI 中以交互方式添加他们需要的功能。
- 我忘记了什么。
很容易扩展此脚本以报告所有已安装的 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 轮:
Features:如果要检索当前安装的产品的功能安装状态 (特征是用户选择table 安装部分:Program
、Dictionaries
、SDK
、Help
、Tutorials
、等等...)那么这可以通过 the MSI API 实现。我不熟悉通过 msiexec.exe
命令行检索功能安装状态的方法。
组件:如果您指的是 MSI 组件(分配给用户选择的安装程序的原子位 table 功能,但用户从未直接看到过),那么我不完全理解您要实现的目标。 ADDLOCAL
是 Feature Installation Options Properties 之一,它只影响功能安装状态,它只会间接影响组件(那些分配给您所指功能的组件)。
重大升级:我想知道您是否没有实施适当的重大升级,这才是您真正的问题所在体验。请使用更多信息更新您的问题。正确实施的主要升级将安装任何新组件,删除过时的组件,并安装您添加的任何新功能。在我写更多之前,请澄清你的问题。
我有一个 VBScript 可以检索您指定的产品(或所有已安装的 MSI 文件)的当前功能状态。如果那确实是你所追求的。
如果您正在执行 ADDLOCAL,那么您就是在明确列出要安装的功能 - 安装的功能是您指定的。它不是增量的,并不意味着"also install these features"。例如,它关闭特征条件。如果您想在使用引导程序进行重大升级期间添加功能,您可以使用 MsiEumFeatures() 来获取已安装的功能列表,您可以将新功能添加到该列表中。另一种方法是使用自定义操作来解析 ADDLOCAL 字符串,在 MigrateFeatureStates 之后排序,并将新的添加到列表中。