我在MSI安装程序中有一个自定义操作,它对某些配置文件进行了一些更改。我的要求是以静默模式运行安装,所以我使用的是msiexec。 这是命令:
msiexec /i myInstaller.msi /l* out.txt myContextParameter=value1
myContextParameter
永远不会传递给自定义操作,所以当我这样做时
context.Parameters["myContextParameter"]
我获得null
值。
当我在UI模式下运行MSI时,参数正确传递。我还确保在CustomActionData
。
答案 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上找到了以下帖子:
在ORCA中查看MSI,您可以在“CustomAction”下看到一些条目。这些条目基本上会覆盖从命令提示符传入的值。如果您只是删除CustomAction表中的条目,如:“CustomTextA_SetProperty_EDIT1”,然后保存MSI(保存AS在ORCA中有不同的行为)。然后,您可以将属性值从命令行传递到MSI。这将允许我使用msiexec远程安装,现在我可以通过命令行将参数传递给安装。我想这是因为CustomAction值的逻辑是在从命令行填充属性值之后执行的,这意味着CustomAction值会覆盖命令行填充值。
在线程的底部还有一个链接,用于在VS中进行一些操作而不是ORCA。