1

我有一个 Visual Studio 安装程序,它有一个自定义 UI,其中一个文本框恢复设置为QUEUEDIRECTORY属性的值。然后我有一个自定义操作(一个安装程序类),它通过这一行传入该属性值/queuedir="[QUEUEDIRECTORY]"- 安装程序工作得很好。

现在,我需要通过命令行发送该值,以便整个组织的系统管理员都可以运行此安装程序。因此,我尝试了以下命令行语句,但它不起作用。

msiexec /i Setup.msi QUEUEDIRECTORY="D:\temp"
Setup.msi QUEUEDIRECTORY="D:\temp"
Setup.msi queuedir="D:\temp"
msiexec /i Setup.msi queuedir="D:\temp"

此外,我似乎无法在网上找到任何不觉得他们破解它的东西,因为他们只是找不到解决方案。我的意思是我已经找到了一些解决方案,他们正在编辑 MSI 数据库和所有内容,但是看起来这不是正确的解决方案 - 特别是因为我使用的是 Visual Studio 2010 - 微软肯定已经做了一些改进,因为它此产品的初始版本。

这是一篇看似可行但仍然感觉像黑客的文章。

无论如何,我希望你能帮助我!

4

3 回答 3

2

这就是我在 Visual Studio 2010 中向我的 MSI 添加仅命令行属性值所做的。它类似于接受的答案,但不那么 hacky。在安装项目 (.vdproj) 目录中创建CommandLineSupport.js,使用以下代码:

//This script adds command-line support for MSI installer
var msiOpenDatabaseModeTransact = 1;

if (WScript.Arguments.Length != 1)
{
    WScript.StdErr.WriteLine(WScript.ScriptName + " file");
    WScript.Quit(1);
}

WScript.Echo(WScript.Arguments(0));
var filespec = WScript.Arguments(0);
var installer = WScript.CreateObject("WindowsInstaller.Installer");
var database = installer.OpenDatabase(filespec, msiOpenDatabaseModeTransact);

var sql
var view

try
{

    sql = "INSERT INTO `Property` (`Property`, `Value`) VALUES ('MYPROPERTY', 'MYPROPERTY=\"\"')";
    view = database.OpenView(sql);
    view.Execute();
    view.Close();

    database.Commit();
}
catch(e)
{
    WScript.StdErr.WriteLine(e);
    WScript.Quit(1);
}

然后在 Visual Studio 中单击您的部署项目以查看项目的属性,并将其设置PostBuildEvent为:

cscript.exe "$(ProjectDir)CommandLineSupport.js" "$(BuiltOuputPath)"

然后使用自定义操作设置开发项目。单击主输出以进入自定义操作属性,并将该CustomActionData字段设置为/MYPROPERTY="[MYPROPERTY]"

然后,您可以在自定义操作安装程序类中访问该属性,如下所示:

public override void Install(IDictionary stateSaver)
{
     base.Install(stateSaver);

     string the_commandline_property_value = Context.Parameters["MYPROPERTY"].ToString();
}

最后你可以运行cmd。 C:\>Setup.msi MYPROPERTY=VALUE

这不需要在 Orca 中进行任何处理,也不需要像在接受的答案中那样使用任何自定义对话框控件。您也不必修改 PostBuildEvent 以具有正确的 .msi 名称。等也可以像这样添加任意数量的属性:

INSERT INTO `Property` (`Property`, `Value`) VALUES ('MYPROPERTY', 'MYPROPERTY=\"\"'),('MYPROPERTY2', 'MYPROPERTY2=\"\"', ('MYPROPERTY3', 'MYPROPERTY3=\"\"')) ";

玩得开心!

于 2014-10-07T18:39:44.913 回答
0

好的,所以我最终选择了我在问题中链接到的解决方案。但为了完整起见,让我把脚本放在这里。我需要做的第一件事是构建一个包含以下代码的 JS 文件(我将其CommandLineSupport.js命名.vdproj.

//This script adds command-line support for MSI build with Visual Studio 2008. 
var msiOpenDatabaseModeTransact = 1;

if (WScript.Arguments.Length != 1)
{
    WScript.StdErr.WriteLine(WScript.ScriptName + " file");
    WScript.Quit(1);
}

WScript.Echo(WScript.Arguments(0));
var filespec = WScript.Arguments(0);
var installer = WScript.CreateObject("WindowsInstaller.Installer");
var database = installer.OpenDatabase(filespec, msiOpenDatabaseModeTransact);

var sql
var view

try
{
    //Update InstallUISequence to support command-line parameters in interactive mode.
    sql = "UPDATE InstallUISequence SET Condition = 'QUEUEDIRECTORY=\"\"' WHERE Action = 'CustomTextA_SetProperty_EDIT1'";
    view = database.OpenView(sql);
    view.Execute();
    view.Close();

    //Update InstallExecuteSequence to support command line in passive or quiet mode.
    sql = "UPDATE InstallExecuteSequence SET Condition = 'QUEUEDIRECTORY=\"\"' WHERE Action = 'CustomTextA_SetProperty_EDIT1'";
    view = database.OpenView(sql);
    view.Execute();
    view.Close();

    database.Commit();
}
catch(e)
{
    WScript.StdErr.WriteLine(e);
    WScript.Quit(1);
}

您当然需要通过在 Orca 中打开 MSI 并将其与您创建的自定义对话框上的Action匹配来确保您替换了正确的。Property

接下来,既然我的 JS 文件可以正常工作,我需要添加一个PostBuildEvent.vdproj您可以通过单击 Visual Studio 中的设置项目并点击F4. 然后找到该PostBuildEvent属性并单击省略号。在那个PostBuildEvent地方这个代码:

cscript "$(ProjectDir)CommandLineSupport.js" "$(BuildOutputPath)Setup.msi"

确保替换Setup.msi为您的 MSI 文件的名称。

虽然我仍然觉得这是一个黑客......因为它是......它可以工作并且现在可以完成这项工作。这是一个足够小的项目,它真的没什么大不了的。

于 2012-10-24T17:45:41.113 回答
0

这是一个旧线程,但有一个更简单、有效的解决方案似乎仍然很难找到,因此我将其发布在这里。

在我的场景中,我们正在使用 VS2013(社区版)和VS 2013 安装程序项目扩展。我们的安装程序项目有一个自定义 UI 步骤收集两个用户文本,以及一个绑定到Install\Start步骤的自定义操作来接收这些文本。

我们可以通过 GUI 设置向导完成这项工作,但不能通过命令行完成。最后,按照这个解决方法,我们能够使命令行也工作,而无需任何 MSI 文件 Orca 编辑

事情的要点是直接从 Visual Studio 为所有需要的自定义对话框属性设置一个值,并且这样的值应该是[YOUR_DIALOG_PROPERTY_NAME]. 此外,似乎此类“公共”属性必须全部大写。

这是最终设置:

自定义对话框属性
注意例如Edit1PropertyEdit1Value

在此处输入图像描述

自定义动作属性
注意,后面在代码中使用的属性键可以用驼峰式命名。

在此处输入图像描述

自定义操作代码

string companyId = Context.Parameters["companyId"];
string companyApiKey = Context.Parameters["companyApiKey"];

命令行

> setup.exe COMPANYID="Some ID" COMPANYAPIKEY="Some KEY" /q /l mylog.txt

高温高压

于 2017-02-27T10:55:17.463 回答