这就是我在 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=\"\"')) ";
玩得开心!