我有一个Visual Studio Installer,它有一个自定义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 - Microsoft自最初发布此产品以来,它肯定做了一些改进。
这里显示的one of the articles 工作但仍然真的感觉像是黑客。
无论如何,我希望你能帮助我!
答案 0 :(得分: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)"
然后使用自定义操作设置Delopyment项目。单击主输出以转到自定义操作属性,并将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=\"\"')) ";
玩得开心!
答案 1 :(得分:0)
好吧,所以我最终选择了我在问题中链接的解决方案。但是,让我把脚本放在这里是为了完整。我需要做的第一件事是构建一个包含以下代码的JS文件(我将其命名为CommandLineSupport.js
)并将其放在与.vdproj
相同的目录中。< / p>
//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
属性并单击elipses。在PostBuildEvent
中放置此代码:
cscript "$(ProjectDir)CommandLineSupport.js" "$(BuildOutputPath)Setup.msi"
确保将Setup.msi
替换为您的MSI文件名称。
虽然我仍觉得这是一场黑客攻击......因为它确实......它有效并且现在可以完成这项工作。这是一个足够小的项目,这真的不是什么大不了的事。
答案 2 :(得分:0)
这是一个老线程,但是有一个更简单,工作的解决方案仍然很难找到,因此我在这里发布它。
在我的场景中,我们正在使用VS2013(社区版)和VS 2013 Installer Project扩展名。我们的安装程序项目有一个自定义UI步骤,收集两个用户文本和绑定到接收这些文本的 Install \ Start 步骤的自定义操作。
我们能够从GUI设置向导进行此工作,但不能从命令行进行。最后,在this workaround之后,我们还可以进行命令行工作,没有任何MSI文件Orca编辑。
事情的要点是直接从Visual Studio为所有需要的自定义对话框属性设置一个值,这样的值应该是[YOUR_DIALOG_PROPERTY_NAME]
形式。此外,似乎必须以所有大写字母命名这样的“公共”属性。
这是最终设置:
自定义对话框属性
注意例如 Edit1Property 和 Edit1Value 。
自定义操作属性
请注意,稍后在代码中使用的属性键可以用驼峰大小写命名。
自定义操作代码
string companyId = Context.Parameters["companyId"];
string companyApiKey = Context.Parameters["companyApiKey"];
命令行
> setup.exe COMPANYID="Some ID" COMPANYAPIKEY="Some KEY" /q /l mylog.txt
HTH