用于MSI的WiX Toolset未使用其预期数据更新注册表项值。如果缺少k:v,则将其添加。如果k:v的数据设置为0,它会完全忽略它,这是这里的实际问题(我认为)
基本目标是在安装之前验证此注册表项值与预期数据值是否存在,如果必须添加/更新密钥,则会触发重新启动提示。
<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
<Product Id="*" Name="SampleInstaller" Language="1033" Version="1.0.0.0" Manufacturer="ACME" UpgradeCode="cf6248e9-d7da-4996-9b8e-90072e8510f6">
<Package InstallerVersion="200" Compressed="yes" InstallScope="perMachine" Platform="x64"/>
<MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." />
<Feature Id="ProductFeature" Title="SampleInstaller" Level="1">
<ComponentGroupRef Id="ProductComponents" />
</Feature>
</Product>
<Fragment>
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="ProgramFilesFolder64">
<Directory Id="INSTALLFOLDER" Name="SampleInstaller" />
</Directory>
</Directory>
<Property Id="VKB_QUERY_HKCU" Secure="yes">
<RegistrySearch Id="VkbVisibleHkcu"
Win64="yes"
Type="raw"
Root="HKCU"
Key="Software\Microsoft\TabletTip\1.7"
Name="TipbandDesiredVisibility"/>
</Property>
<ComponentGroup Id="ProductComponents" Directory="INSTALLFOLDER">
<Component Id="ShowVKB_Registry_HKCU" Guid="{97AB4B1D-C9C8-4B34-9328-FF8CA3ED8992}" Directory="INSTALLFOLDER">
<RegistryKey Id="VKB_Registry_Key_HKCU" Root="HKCU" Key="Software\Microsoft\TabletTip\1.7" ForceCreateOnInstall="yes" ForceDeleteOnUninstall="no">
<RegistryValue Id="VKB_Registry_Value_HKCU" Action="write" Type="integer" Name="TipbandDesiredVisibility" Value="1"/>
</RegistryKey>
</Component>
</ComponentGroup>
<InstallExecuteSequence>
<ScheduleReboot After="InstallFinalize">NOT (VKB_QUERY_HKCU = "#1")</ScheduleReboot>
</InstallExecuteSequence>
</Fragment>
</Wix>
此外,检查MSIEXEC
和{{1}时,似乎0
的退出代码始终返回3010
而不是1641
$LastExitCode
}。我没有搞乱不同的重启行为,但我认为重启提示会导致我的安装程序退出非零,所以任何指导也都很感激。
答案 0 :(得分:0)
执行此操作并使用以下命令创建详细日志:
msiexec / I [msi的路径] / l * vx [文本日志文件的路径]
并查看属性值等。您最不可能得到3010退出结果的原因是ScheduleReboot的条件为false。
假设所有内容都按预期工作,问题可能是您需要在属性声明中将Secure设置为Yes,否则该值不会从UI序列注册表搜索转移到执行序列中。如果日志显示它在安装开始时获得了正确的值但稍后丢失了,则很可能是问题。
您的一条评论指的是%errorlevel%,但不清楚为什么这是相关的。如果您是从批处理文件或类似文件启动它,那么这是添加的有用信息。此外,如果您以某种方式安装它,与当前的交互式用户分开,那么这也是有用的。
日志似乎表明一切都很好。属性具有看起来正确的值,并执行ScheduleReboot操作。我看到的唯一问题是Windows Installer没有显示要求用户进行重新启动的对话框,因此它执行非交互式操作,即返回3010以告知调用者需要重新启动。没有明显的理由说明Windows Installer没有提示重新启动(这是ScheduleReboot的功能),但如果安装是在非交互式用户上下文中运行,那么Windows将不会向其他用户显示桌面对话框(或没有用户没有人登录)。
答案 1 :(得分:0)
因此,示例有效,但您无法通过重新运行安装来重复测试它。你必须先卸载它,或者像我一样偶然发现原因,并在重新运行之前重新编译。
我注意到样本在重新编译后才正常工作。因此,我猜测安装程序在编译时有一个GUID或与之绑定的东西,然后将其包含在您的安装中。当重新运行安装时,它会快速运行和关闭,而不是要求您先卸载或删除现有产品,所以我假设它没有评估我的安装程序必须写密钥,并且在没有必要做更多的时候就结束了。
所以基本上它是一个测试错误/缺乏固有的WiX知识。
因此,除非您专门尝试触发升级行为,否则请在重新运行之前卸载MSI。
我不确定为什么我没有收到有关已有产品的错误消息。我当然会想到这将是默认行为。