如何在运行时从 msi 特征选择树中删除一个特征?

如何在运行时从 msi 特征选择树中删除一个特征?

当我们启动 msi 时,经过几个屏幕之后我们将获得功能选择页面。

功能选择页面:

在此处输入图片描述

我们可以通过改变特征表、显示列值为 0 来删除任何特征。

但是如何在运行时改变它,我的意思是基于某些属性值,这些属性值可能会从我们添加的不同自定义对话框中或基于自定义操作而改变。

我尝试创建一个属性并将该属性添加到特征表的显示列中[Property1]

但它不接受非整数值。

有什么建议吗,请问如何实现。

我目前尝试过这个。

创建了 vbscript 类型的自定义操作

UpdateFeatureDisplay "erwinDM",Session.Property("DM_VISIBLE")   
UpdateFeatureDisplay "NoSQLStandalone",Session.Property("NS_VISIBLE")   

Sub UpdateFeatureDisplay(featureName,display)   
    Set viewlist = Database.OpenView("SELECT * FROM `Feature` WHERE `Feature`='"& featureName &"'")
    viewlist.Execute
    Set reclist = viewlist.Fetch
    viewlist.Modify 6 , reclist
    reclist.StringData(5)= CStr(display)
    'reclist.IntegerData(5)= CInt(display)
    viewlist.Modify 7 , reclist 
    viewlist.Close
End Sub

并且,当我单击下一步时,在自定义功能选择页面之前,它会触发。我从复选框中获取值。

但我在日志中收到如下错误。

MSI (c) (14:B4) [17:50:30:269]: Note: 1: 1720 2: setFeatureDisplay 3: -2147467259 4: Msi API Error 5: Modify,Mode,Record 6: 8 7: 2 
Action ended 17:50:30: setFeatureDisplay. Return value 1.

如果我将它保存在对话框的下一个事件中,而是在 UI 序列的设置初始化之后保存它,则不会出现上述错误,但也不会反映在功能页面中。

如果我们将使用 UI 改变的属性值作为命令行参数传递,那么只有它才会反映出来。我的意思是,在启动 msi 期间。

答案1

如果您想在运行时从树中删除该功能,则需要使用Feature自定义操作中的 SQL 查询修改表。类似这样(我没有测试代码,但它应该非常接近您的需求):

featurename="Your Feature Name"
Set oView = Database.OpenView("SELECT * FROM `Feature` WHERE `Feature`='"&featurename&"'")
oView.Execute

' test on first Feature record
Set oRecord = oView.Fetch

' delete the original
oView.Modify 6, oRecord

' modify and temporarily write back new
oRecord.IntegerData(5) = 0
oView.Modify 7, oRecord

' close up shop
oView.Close

相关内容