msiexec不会将参数传递给自定义操作

时间:2010-02-01 13:04:30

标签: properties windows-installer action

我在MSI安装程序中有一个自定义操作,它对某些配置文件进行了一些更改。我的要求是以静默模式运行安装,所以我使用的是msiexec。 这是命令:

msiexec /i myInstaller.msi /l* out.txt myContextParameter=value1

myContextParameter永远不会传递给自定义操作,所以当我这样做时 context.Parameters["myContextParameter"]我获得null值。

当我在UI模式下运行MSI时,参数正确传递。我还确保在CustomActionData

中正确设置了属性的名称

4 个答案:

答案 0 :(得分:8)

我一直在这个墙上撞墙,所以这就是我发现的:

您必须在命令行上设置参数,并在每个自定义操作上设置“CustomActionData”属性(无论您在Install,Commit等下有什么)

您的命令行看起来像这样:

msiexec /i myInstaller.msi MYFIRSTPARAM=VALUE1 MYSECONDPARAM=VALUE2

然后,您的CustomActionData应如下所示:

/myfirstparam=[MYFIRSTPARAM] /mysecondparam=[MYSECONDPARAM]


现在,这里有一堆特殊情况:

  • 看起来@Klaus是对的,您需要在参数名称中使用ALLCAPS。

  • 如果您的值包含空格,则在命令行和CustomActionData属性中都需要引号括起来,如:

    msiexec /i myInstaller.msi MYFIRSTPARAM="VALUE1" MYSECONDPARAM="VALUE2"

    /myfirstparam="[MYFIRSTPARAM]" /mysecondparam="[MYSECONDPARAM]"

  • 如果您的值以斜杠结尾,就像大多数文件路径一样,那么您将遇到一个奇怪的问题:当msiexec构建您的习惯数据时,它将创建此字符串:

    /myfirstparam="C:\myfile\" /mysecondparam="C:\myfile\"

    如果在命令行上使用引号并不重要,如果该斜杠是值的最后一个字符,它将被有效地读取为转义字符,并将转义您的customactiondata属性中的引号。这会造成严重破坏。解决方案是:1)在参数和最后一个引号之间添加一个空格,然后记住在代码中的某个地方修剪(),或者2)在参数和引号之间添加和额外的斜杠,以逃避逃脱字符。请参阅以下两种方法:

    /myfirstparam="[MYFIRSTPARAM] " /mysecondparam="[MYSECONDPARAM]\"

希望有所帮助。

答案 1 :(得分:7)

MixedCase属性为“私有”,不会从命令行传入。

ALLCAPS属性是“public”,可以在命令行中传入。

但是只有安全公共属性被传递到'服务器'(即在UAC提升期间保留)。请参阅SecureCustomProperties属性文档。

假设您尝试在延迟CA中访问此属性,这将发生在服务器端,因此您需要使用也标记为安全的公共属性(所有大写)。

以下是使用WiX的示例:

<Property Id="MYPUBLICPROPERTY" Secure="yes" Value="{}">

答案 2 :(得分:1)

如果您希望能够从外部传递参数,则需要在参数名称中使用ALLCAPS。我知道这听起来很奇怪,但试试吧! : - )

答案 3 :(得分:1)

我知道这是一个老线程,但我在这里尝试了各种各样的事情,似乎我不知所措。然后我在msdn上找到了以下帖子:

http://social.msdn.microsoft.com/Forums/windows/en-US/8dd009ce-52d5-4737-98c8-89d9831ab60b/unable-to-pass-parameters-to-msi-thro-msiexec-via-command-prompt?forum=winformssetup&prof=required

在ORCA中查看MSI,您可以在“CustomAction”下看到一些条目。这些条目基本上会覆盖从命令提示符传入的值。如果您只是删除CustomAction表中的条目,如:“CustomTextA_SetProperty_EDIT1”,然后保存MSI(保存AS在ORCA中有不同的行为)。然后,您可以将属性值从命令行传递到MSI。这将允许我使用msiexec远程安装,现在我可以通过命令行将参数传递给安装。我想这是因为CustomAction值的逻辑是在从命令行填充属性值之后执行的,这意味着CustomAction值会覆盖命令行填充值。

在线程的底部还有一个链接,用于在VS中进行一些操作而不是ORCA。

http://blogs.technet.com/b/alipka/archive/2007/04/20/how-to-use-custom-actions-in-visual-studio-setup-project-msi-from-command-line.aspx