在 RegistrySearch 失败后设置 属性 的自定义操作不是 运行

Custom action to set a property after a failed RegistrySearch is not running

目的是,如果在注册表中找不到该值,那么我想分配一个默认值,然后将该值作为默认值显示在安装程序 UI 的一个字段中。我实际上想使用的默认值是 [ComputerName] 但显然我不能在 属性 值属性中直接使用 [ComputerName] 因为它会给我编译错误,具体来说:

warning CNDL1077: The 'MYPROPERTY' Property contains '[ComputerName]' in its value which is an illegal reference to another property. If this value is a string literal, not a property reference, please ignore this warning. To set a property with the value of another property, use a CustomAction with Property and Value attributes.

我想在尝试 [ComputerName] 之前让它使用纯文本,但到目前为止我什至无法让它工作。

在我的项目中,我有一个 Product.wxs 文件,其中包含 Product 元素、许多自定义操作(其中大部分都 运行ning 可以,但它们都是 运行ning明显更晚)和以下不合作的元素,它们都是 Product 元素下的兄弟元素。

属性定义和注册表搜索:

<Property Id="MYPROPERTY" Value="ADefaultValue">
    <RegistrySearch Id="MyProperty" Type="raw" Root="HKLM" Win64="$(var.Win64)"
                  Key="Software\MyCompany\MyApplication" Name="MyProperty" />
</Property>

自定义操作定义:

<CustomAction Id="SetMyPropertyDefault" Property="MYPROPERTY" Value="MyCustomValue" Execute="immediate"/>

自定义操作执行:

<InstallExecuteSequence>
    <Custom Action="SetMyPropertyDefault" After="AppSearch"><![CDATA[MYPROPERTY="ADefaultValue"]]></Custom>
</InstallExecuteSequence>

它根本不适合我。

我试过的自定义元素内容:

<Custom Action="SetMyPropertyDefault" After="AppSearch"><![CDATA[MYPROPERTY="ADefaultValue"]]></Custom>

<Custom Action="SetMyPropertyDefault" After="AppSearch">1</Custom> // I thought this would always run the custom action.

<Custom Action="SetMyPropertyDefault" After="AppSearch">NOT MYPROPERTY</Custom> // Back when I wasn't using the default value on the property at all.

结果总是一样,我仍然 "ADefaultValue" 出现在 UI 中,从来没有替代 "MyCustomValue"。

根据每个博客和 SO post 我已经看到我正在做我应该做的事情,除了很明显我遗漏了什么。
有什么想法吗?


UPDATE/Answer:

@sutarmin-anton 提供的我遗漏的信息是 InstallExecuteSequence 之前的 InstallUISequence 运行s(对我来说似乎违反直觉,但你去吧) .
但碰巧我不需要在每个安装序列元素中显式复制自定义操作调用,而是使用了 Set属性 元素。
所以现在我的 Product.wxs 中有以下内容作为 Product 元素的子元素:

<Property Id="MYPROPERTY">
    <RegistrySearch Id="MyProperty" Type="raw" Root="HKLM" Win64="$(var.Win64)" Key="Software\MyCompany\MyApplication" Name="MyProperty" />
</Property>

<SetProperty Id="MYPROPERTY" After="AppSearch" Value="[ComputerName]">NOT MYPROPERTY</SetProperty>

现在 运行在 InstallUISequence 和 InstallExecuteSequence 中的 AppSearch 之后 SetProperty,但是第二次 运行s NOT MYPROPERTY 会出来false 所以它不会被重置,当然如果它在安静模式下 运行 它仍然可以正常工作。

当您执行安装程序 UI 时,安装在 InstallUISequence 中。 InstallExecuteSequence 在所有 UI 事件之后运行。这是因为你没看过"MyCustomValue"。要在 UI 序列之前更改 属性,您应该将自定义操作放在 "InstallUISequence".

顺便问一下,你为什么不将 属性 的默认值设置为 "MyCustomValue"?然后,如果 AppSearch 在注册表中找不到值,它只会保留您尝试手动设置的默认值。

你可能把事情复杂化了。如果您不设置默认值,则根本不会设置 MYPROPERTY 值。因此,如果 'NOT MYPROPERTY'

,您可以致电您的 CA 进行设置

我看到你已经尝试过这个,我想说这是我尝试诊断而不是尝试其他方法的正确方法。详细的日志将是无价的。做一个:

msiexec /i [msi 路径] /l*vx [文本日志文件路径]

查看 CA 的名称、AppSearch 的作用、属性 值等。

您对“我无法使用 [ComputerName] - 如果这是问题所在为什么不告诉我们发生了什么事的原始评论,也许有一个不需要所有这些的解决方案。编译错误是什么,例如?