【问题标题】:MsiPackage conditional install: Don't uninstall if it detects package is already installedMsiPackage 条件安装:如果检测到软件包已安装,则不要卸载
【发布时间】:2020-11-24 10:49:03
【问题描述】:

我正在使用 Wix Bootstrapper,并希望通过 .msi 包安装一些应用程序以及我的主应用程序。这些应用程序可能已经安装在目标 PC 中,因此我需要先检测这些应用程序,如果它们已经安装则跳过安装。此外,在卸载过程中,不应卸载这些应用程序,因为 Wix Bootstrapper 并未安装它们。

我尝试使用 InstallCondition 属性,但(如预期的那样)如果检测到应用程序已安装,它会卸载。

我的 Bundle.wxs 看起来像这样:

...
  <Bundle>
    <util:FileSearch Id='CheckApplicationX' Path='[ProgramFilesFolder]ApplicationX\ApplicationX.exe' Variable='ApplicationXFile' Result='exists' />
    <Chain DisableRollback="yes">
      ...
      <MsiPackage Id="InstallApplicationX" Vital="yes" Compressed="yes" DisplayInternalUI="no" EnableFeatureSelection="no" SourceFile="..\application-x.msi" Name="Application X" DisplayName="Application X" ForcePerMachine="yes" InstallCondition="NOT ApplicationXFile" />
      ...
    </Chain>
  </Bundle>
...

感谢任何帮助/提示!

【问题讨论】:

    标签: installation wix uninstallation bootstrapper burn


    【解决方案1】:

    您可以尝试通过查看 Windows 注册表来检测应用程序是否已安装,并尝试识别这些应用程序是否留下了“痕迹”。

    您可以使用RegistrySearch 标记对您要查找的注册表项执行条件评估,然后拒绝安装。

    Wix 网站上有一个示例,地址为 this link

    以下示例显示了如何定义目标计算机上是否安装了 .NET 2.0

    <Property Id="NETFRAMEWORK20">
    <RegistrySearch Id="NetFramework20"
                    Root="HKLM"
                    Key="Software\Microsoft\NET Framework Setup\NDP\v2.0.50727"
                    Name="Install"
                    Type="raw" />
    </Property>
    <Condition Message="This application requires .NET Framework 2.0. Please install the .NET Framework then run this installer again.">
        <![CDATA[Installed OR NETFRAMEWORK20]]>
    </Condition>
    

    【讨论】:

    • 感谢您的回复!我已经阅读了文档并在 RegistrySearch 上使用了 FileSearch。另外,我不能使用 bal:Condition 元素,因为这将停止整个捆绑包的安装。如果它检测到它以前安装过,我只需要跳过特定的 MsiPackage。
    • 如果您将 MsiPackage 安装为自定义操作,则可以使用
    猜你喜欢
    • 2021-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-27
    • 2013-11-01
    相关资源
    最近更新 更多