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

Properties msiexec不将参数传递给自定义操作,properties,windows-installer,action,Properties,Windows Installer,Action,我在MSI安装程序中有一个自定义操作,可以对一些配置文件进行一些更改。我的要求是在静默模式下运行安装,因此我使用的是msiexec。 命令如下: msiexec /i myInstaller.msi /l* out.txt myContextParameter=value1 myContextParameter从未传递给自定义操作,因此当我这样做时 context.Parameters[“myContextParameter”]我得到一个null值 在UI模式下运行MSI时,参数传递正确。我还

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

msiexec /i myInstaller.msi /l* out.txt myContextParameter=value1
myContextParameter
从未传递给自定义操作,因此当我这样做时
context.Parameters[“myContextParameter”]
我得到一个
null


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

中正确设置了属性的名称。如果希望能够从外部传递参数,则需要在参数名称中使用ALLCAPS。我知道这听起来很奇怪,但试试看!:-)

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

ALLCAPS
属性是“公共”的,可以通过命令行传入

但是,只有安全的公共属性才会传递到“服务器”(即在UAC提升期间保留)。请参阅属性文档

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

下面是一个使用WiX的示例:

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

这一次我的头撞到了墙上,下面是我的发现:

您必须在命令行上设置参数,以及在每个自定义操作上的“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构建customactiondata时,它将创建以下字符串:

    /myfirstparam=“C:\myfile\”/mysecondparam=“C:\myfile\”

    无论是否在命令行中使用引号,如果斜杠是值中的最后一个字符,它将被有效地读取为转义字符,并将转义customactiondata属性中的引号。这会造成大破坏。解决方案是:1)在参数和最后一个引号之间添加空格,然后记得在代码中的某个地方修剪它;2)在参数和引号之间添加额外的斜杠,以便转义转义字符。请参见以下两种方法:

    /myfirstparam=“[myfirstparam]”/mysecondparam=“[mysecondparam]\”


希望能有所帮助。

我知道这是一条老线索,但我在这里尝试了各种方法,似乎我不知所措。然后,我在msdn上找到了以下线程:

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

在线程的底部还有一个链接,可以在VS中执行一些操作,而不是ORCA


您的意思是这样称呼它:msiexec/i myInstaller.msi/l*out.txt MYCONTEXTPARAMETER=value1Yes就是这样。您是否还记得更改
上下文。参数[“MYCONTEXTPARAMETER”]
?是的,上下文。参数不包含任何内容!谢谢你的回复,你能分享一下CA公共财产应该如何申报的例子吗。很多人都知道,你在用什么?我可能会补充一点,下划线是不允许的(使属性私有)。其他角色可能也一样。这里也一样,不使用WiX,不过微软内部人士似乎在使用它。