繁体   English   中英

如果已安装,则跳过MSI

[英]Skip MSI if already installed

我有一个WIX安装程序,可在其中安装程序和.NET Core 1.0.5。 .NET Core以静默方式安装:

<ExePackage InstallCommand="/q" Id = "DotNetCore.Setup" SourceFile="..\DotNetCore\DotNetCore.exe" />

在干净的系统上,安装程序运行正常。 如果尝试重新安装,则会重新启动。 .NET安装程序可能检测到已安装,并自行触发了修复功能。 如果已安装.NET Core,是否可以跳过安装?

我尝试寻找命令行参数,但似乎没有任何用处

ExePackage元素具有DetectCondition属性。 这意味着您可以指定条件,如果条件评估为false,则将安装软件包。 您可以将其与util:RegistrySearch元素结合使用,该元素可用于在注册表中进行搜索以检测.NET Core是否已安装。

为了执行注册表搜索,您首先需要找到一个在安装.NET时出现的注册表项。

在注册表中找到“ HKLM \\ SOFTWARE \\ Microsoft \\ Windows \\ CurrentVersion \\ Uninstall \\”(或在64位计算机上找到“ HKLM \\ SOFTWARE \\ WOW6432Node \\ Microsoft \\ Windows \\ CurrentVersion \\ Uninstall \\”)项,然后找到子项对应于.NET Core-此键的“ DisplayName”值应为“ .NET Core”或类似名称。

找到正确的密钥后,其名称应为十六进制字符串,这是与.NET Core程序相对应的GUID之一。 然后,您可以使用以下代码来允许安装程序搜索此密钥的存在:

<util:RegistrySearch Id="VCRedistTest32" Root="HKLM" Key="SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{YOUR_GUID_HERE}" Result="exists" Variable="DOTNETPresent" Win64="no"/>

(对于64位注册表,请使用Win64 =“ yes”代替)

然后,您可以将以下内容用于ExePackage:

<ExePackage InstallCommand="/q" Id = "DotNetCore.Setup" SourceFile="..\DotNetCore\DotNetCore.exe" DetectCondition="DOTNETPresent"/>

不要忘记将对util扩展的引用添加到顶级wix元素:

<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"
 xmlns:util="http://schemas.microsoft.com/wix/UtilExtension">

如果安装了.net Core,则需要使用DetectCondition属性和分配属性的注册表搜索。

ExePackage元素-DetectCondition

“确定目标系统上是否存在该程序包的条件。此条件可以使用内置变量和搜索返回的变量。此条件是必需的,因为Windows没有提供检测ExePackage存在的方法。使用此条件来确定在执行捆绑操作期间如何处理此软件包;例如,如果此条件为false或忽略并且正在安装捆绑软件,则Burn将安装此软件包。”

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM