从 MSI 安装程序的命令行覆盖“文本框”对话框字段(Visual Studio 2010 Web 设置)

Posted

技术标签:

【中文标题】从 MSI 安装程序的命令行覆盖“文本框”对话框字段(Visual Studio 2010 Web 设置)【英文标题】:Overriding "Textboxes" dialog fields from the command line in MSI installer (Visual Studio 2010 Web Setup) 【发布时间】:2011-11-15 22:20:13 【问题描述】:

背景

我在 Visual Studio 2010 中有一个 Web 设置项目。

User Interface 部分,我有一个自定义Textboxes 对话框。这些文本字段的属性名称类似于 EDITA1、EDITA2。

我有一个Custom Action,它利用了这些属性:

CustomActionData = /foo="[EDITA1]" /bar="[EDITA2]" /zip="[BLARB]"

在处理此自定义操作的代码中,这些参数可在Context.Parameters 字典中找到

public override void Install(System.Collections.IDictionary stateSaver) 
    string foo = Context.Parameters["foo"]; // originates in edit box EDITA1
    string bar = Context.Parameters["bar"]; // originates in edit box EDITA2
    string zip = Context.Parameters["zip"];

问题

我希望能够在没有 UI 的情况下从脚本运行安装程序,因此我需要通过命令行传入 foobar 的值。您应该这样做的方式是将PROPERTY=VALUE 附加到您的 MSI 命令行,如下所示:

msiexec /qn /i MyInstaller.msi EDITA1=John EDITA2=Smith BLARB=Donut

但这不起作用。 与自定义文本字段相关联的自定义参数会显示。例如,BLARB 可以很好地通过 (Parameters["zip"]=="Donut")。但是与文本字段关联的属性不会显示出来,就好像它们在调用我的自定义安装函数之前被空的(但隐藏的)对话框破坏了一样。

【问题讨论】:

【参考方案1】:

覆盖属性值的不是对话框。日志文件将帮助您确定导致属性值更改的原因。

【讨论】:

日志文件没有提到属性 EDITA1,但确实包含以下两行:15:15:44: CustomTextA_SetProperty_EDIT1.15:15:44: CustomTextA_SetProperty_EDIT1. Return value 1.。这在日志文件中非常早,在调用任何自定义操作之前。这就是向我建议安装程序在启动时初始化这些编辑字段的原因。 确实如此。您将不得不编辑 MSI 并设置在没有 UI 时不会执行重置道具的自定义操作 CustomTextA_SetProperty_EDIT1 不是我的代码。它发生在 任何自定义操作运行之前。事实上,只有一个自定义操作,它发生在提交时。 谷歌搜索了一下,我在 msdn 论坛上找到了这篇文章。它似乎准确地描述了您的情况:social.msdn.microsoft.com/forums/en-US/windowscompatibility/… 很好的发现。不幸的是,那里没有提出解决方案。 F***a 认为我做了同样的事情“似乎命令行参数被自定义对话框控件的'默认值'覆盖,即使默认值为空。”。他/她想出的解决方法是我想到的,但试图避免。【参考方案2】:

好吧,我遇到了同样的问题,在按照互联网上的所有建议进行大量测试和调试后,我发现自己很无助,直到我阅读了this 的帖子。

在 web setup 项目中,设置 EDITA1 Value=[VARIABLE]。在自定义操作中,自定义数据集/va=[EDITA1]

现在当您通过命令行安装应用程序时,您需要设置VARIABLE=data。 当您进入 GUI 时,在文本框中输入数据。

有效,我也在日志文件中进行了测试和验证。

【讨论】:

【参考方案3】:

问题是生成的 MSI 文件中的 InstallExecuteSequence 有一些自定义操作,例如 CustomTextA_SetProperty_EDIT1。如果您看一下,它实际上确实将属性值设置为 null,即使您已在命令行上指定了它。要将它们从命令行静默传递到 MSI,您需要将 MSI 文件(例如使用 Orca)编辑到:

    删除 InstallExecuteSequence 表中名称类似于 CustomTextA_SetProperty_EDIT1 的自定义操作。

    在属性表中,SecureCustomProperties 值,添加您的编辑属性,所有这些属性都用冒号分隔。例如,将“;EDITA1”添加到现有列表中。

【讨论】:

以上是关于从 MSI 安装程序的命令行覆盖“文本框”对话框字段(Visual Studio 2010 Web 设置)的主要内容,如果未能解决你的问题,请参考以下文章

使用可覆盖属性时如何按命令行卸载 MSI 包?

从命令行卸载 MSI 文件而不使用 msiexec

具有权限的自定义操作

MSI 软件包的静默安装

使用 VS2017 安装程序项目从命令行运行 vs2017 DevEnv

Subversion安装过程