Properties msiexec不将参数传递给自定义操作
我在MSI安装程序中有一个自定义操作,可以对一些配置文件进行一些更改。我的要求是在静默模式下运行安装,因此我使用的是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时,参数传递正确。我还
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时,它将创建以下字符串:
无论是否在命令行中使用引号,如果斜杠是值中的最后一个字符,它将被有效地读取为转义字符,并将转义customactiondata属性中的引号。这会造成大破坏。解决方案是:1)在参数和最后一个引号之间添加空格,然后记得在代码中的某个地方修剪它;2)在参数和引号之间添加额外的斜杠,以便转义转义字符。请参见以下两种方法:/myfirstparam=“C:\myfile\”/mysecondparam=“C:\myfile\”
/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,不过微软内部人士似乎在使用它。