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

12 windows-installer action properties

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

msiexec /i myInstaller.msi /l* out.txt myContextParameter=value1
Run Code Online (Sandbox Code Playgroud)

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

当我在UI模式下运行MSI时,参数正确传递.我还确保在属性中正确设置了属性的名称CustomActionData.

Sli*_*345 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构建您的customactiondata时,它将创建此字符串:

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

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

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

希望有所帮助.


sas*_*ont 7

MixedCase 属性是"私有",不会从命令行传入.

ALLCAPS 属性是"public",可以在命令行中传递.

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

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

以下是使用WiX的示例:

<Property Id="MYPUBLICPROPERTY" Secure="yes" Value="{}">
Run Code Online (Sandbox Code Playgroud)


Kla*_*sen 1

如果您希望能够从外部传递参数,则需要在参数名称中使用全部大写字母。我知道这听起来很奇怪,但是尝试一下!:-)