【问题标题】:Wix ExePackage always installs regardless of DetectCondition, InstallCondition, on install, or uninstall无论 DetectCondition、InstallCondition、安装或卸载,Wix ExePackage 始终安装
【发布时间】:2017-09-21 01:13:03
【问题描述】:

我的挫败感接近 10。我已经在 wix 安装程序上工作了几个星期了。此安装程序为我们的软件安装先决条件。我没有 Visual Studio,所以我制作了一个批处理文件来构建(仅读取命令行)wix 项目。此捆绑包中有大约 9 个先决条件,包括 .msi、.msu 和 .exe 文件。

我的问题具体涉及链元素中描述的 ExePackage。似乎有几个(但不是全部)ExePackages 总是安装不管 DetectCondition、InstallCondition、安装和 Unistall。日志文件显示 DetectCondition = true 和 InstallCondition = false 但这些问题 ExePackages 仍然执行和安装。每一个。时间。

在过去两周的挫折中,我在 stackoverflow 的某个地方读到,ExePackages 不允许安装程序与 .msi 文件具有相同的可见性,这可能会导致我正在处理的问题出现问题。我似乎记得有人提到在卸载时如何执行 ExePackage,如果实际的 .exe 文件没有正确的内部标志,它将安装而不是卸载。但是,如果我没记错的话,虽然这些答案对他们的问题很有帮助,但我还没有找到完全阻止在某些条件下执行 ExePackage 的东西。

编辑 1:我使用的是 WiX 3.7 版。

我想要一个示例或一些生命线,让我知道如何执行此操作。下面是一个问题 ExePacakge 的例子:

...
<Bundle Name='MySoftware' Version='1.0.0.0' Manufacturer='MyCompany'
    UpgradeCode='{GUID}'
    Condition='(VersionNT >= v6.1 AND ServicePackLevel >= 1)'>

    ...
    <util:FileSearch Id='CheckChromeVersion' Path='[ProgramFilesFolder]Google\Chrome\Application\chrome.exe' Variable='CHROMEVERSION' Result='version' />
    <util:FileSearch Id='CheckChromeExists' Path='[ProgramFilesFolder]Google\Chrome\Application\chrome.exe' Variable='CHROMEEXISTS' Result='exists' />
    ...

    <Chain>
        ...
        <ExePackage Id='Chrome' 
            Compressed='yes' 
            SourceFile='.\installers\ChromeStandaloneSetup64-v51.0.2704.103.exe'
            PerMachine='yes'
            DetectCondition='CHROMEEXISTS AND CHROMEVERSION="51.0.2704.103"'
            InstallCondition='(NOT CHROMEEXISTS) OR (NOT CHROMEVERSION="51.0.2704.103")' />
        ...
    </Chain>
</Bundle>
...

以下是日志文件中的所有“chrome”实例:

[0910:0794][2017-09-20T06:30:33]i000: Setting numeric variable 'CHROMEEXISTS' to value 1
[0910:0794][2017-09-20T06:30:33]i000: Setting version variable 'CHROMEVERSION' to value '51.0.2704.103'
[0910:0794][2017-09-20T06:30:33]i052: Condition 'CHROMEEXISTS AND CHROMEVERSION="51.0.2704.103"' evaluates to true.
[0910:0794][2017-09-20T06:30:33]i101: Detected package: Chrome, state: Present, cached: None
[0910:0794][2017-09-20T06:30:34]i052: Condition '(NOT CHROMEEXISTS) OR (NOT CHROMEVERSION="51.0.2704.103")' evaluates to false.
[0910:0794][2017-09-20T06:30:34]w321: Skipping dependency registration on package with no dependency providers: Chrome
[0910:0794][2017-09-20T06:30:34]i000: Setting string variable 'WixBundleLog_Chrome' to value 'C:\Users\User\AppData\Local\Temp\MyProgram_20170920063033_2_Chrome.log'
[0910:0794][2017-09-20T06:30:34]i000: Setting string variable 'WixBundleRollbackLog_Chrome' to value 'C:\Users\User\AppData\Local\Temp\MyProgram_20170920063033_2_Chrome_rollback.log'
[0910:0794][2017-09-20T06:30:34]i201: Planned package: Chrome, state: Present, default requested: Absent, ba requested: Absent, execute: Uninstall, rollback: Install, cache: Yes, uncache: Yes, dependency: None
[01B4:0E6C][2017-09-20T06:30:54]i305: Verified acquired payload: Chrome at path: C:\ProgramData\Package Cache\.unverified\Chrome, moving to: C:\ProgramData\Package Cache\9102865AE2381BC34E91C107DA5818CF971356E8\ChromeStandaloneSetup64-v51.0.2704.103.exe.
[01B4:0F1C][2017-09-20T06:31:19]i301: Applying execute package: Chrome, action: Uninstall, path: C:\ProgramData\Package Cache\9102865AE2381BC34E91C107DA5818CF971356E8\ChromeStandaloneSetup64-v51.0.2704.103.exe, arguments: '"C:\ProgramData\Package Cache\9102865AE2381BC34E91C107DA5818CF971356E8\ChromeStandaloneSetup64-v51.0.2704.103.exe"'
[0910:0794][2017-09-20T06:31:33]i319: Applied execute package: Chrome, result: 0x0, restart: None
[01B4:0F1C][2017-09-20T06:31:59]i351: Removing cached package: Chrome, from path: C:\ProgramData\Package Cache\9102865AE2381BC34E91C107DA5818CF971356E8\
[0910:0794][2017-09-20T06:32:02]i410: Variable: CHROMEEXISTS = 1
[0910:0794][2017-09-20T06:32:02]i410: Variable: CHROMEVERSION = 51.0.2704.103
[0910:0794][2017-09-20T06:32:02]i410: Variable: WixBundleLog_Chrome = C:\Users\User\AppData\Local\Temp\MyProgram_20170920063033_2_Chrome.log
[0910:0794][2017-09-20T06:32:02]i410: Variable: WixBundleRollbackLog_Chrome = C:\Users\User\AppData\Local\Temp\MyProgram_20170920063033_2_Chrome_rollback.log

提前感谢您的帮助。

【问题讨论】:

  • 对于InstallCondition:如果条件评估为假并且正在安装、修复或修改包,则将卸载包。这意味着它应该尝试卸载包,但没有给出卸载命令。我想这意味着捆绑包正在使用安装程序忽略的一些参数执行安装程序。尝试使用删除 ChromeStandaloneSetup64-v51.0.2704.103.exe 所需的任何参数添加 UninstallCommand(如果可能的话)。
  • 实际上,我认为您可以删除InstallCondition,因为只有在DetectCondition 评估为假(或被省略)时,捆绑包才会安装包。 “Burn 使用此条件来确定在捆绑操作期间如何处理此包;例如,如果此条件为 false 或省略并且正在安装捆绑包,则 Burn 将安装此包。”
  • 谢谢菲尔塞尔默。删除 InstallCondition 确实有效。我将 Brian Sutherland 的答案标记为正确,因为他写的是答案。感谢您的回复。

标签: wix installation bundle


【解决方案1】:

问题是由您的 ExePackage 上的 InstallCondition 引起的

在安装包之前要评估的条件。仅当条件评估为 true 时才会安装包。如果条件评估为 false 并且正在安装、修复或修改包,则将卸载包。

在您的日志中,您可以看到 DetectCondition 被正确评估为“True”,因此该捆绑包确实检测到安装了正确版本的 Chrome。

但是 InstallCondition 被评估为假

[0910:0794][2017-09-20T06:30:34]i052: Condition '(NOT CHROMEEXISTS) OR (NOT CHROMEVERSION="51.0.2704.103")' evaluates to false.

这会导致这条计划线出现

[0910:0794][2017-09-20T06:30:34]i201: Planned package: Chrome, state: Present, default requested: Absent, ba requested: Absent, execute: Uninstall, rollback: Install, cache: Yes, uncache: Yes, dependency: None

我认为安装条件应该用于以下情况:您可以根据系统上已有的内容或在引导程序的 UI 部分选择要安装的内容来选择性地安装内容。即:如果另一个程序已经存在,您可以使用此 ExePackage,否则不要安装它(如果该其他程序不再存在,则卸载它)。在这种情况下,您将使用安装条件,但通常定义安装条件是没有用的。

下面的旧答案不适用于该问题,但它仍然对具有版本比较条件的人有用,所以我会留下它


一个条件下的版本比较应该是

CHROMEVERSION gt;= v51.0.2704.103

版本前面的 v 告诉 wix 将条件评估为两个版本变量。所有 RegistrySearch 变量都是字符串变量,并且您的条件中的变量之间的比较将根据变量本身的格式进行评估。由于注册表搜索始终是一个字符串,表达式中的另一个操作数决定了发生什么类型的比较。

【讨论】:

  • 我正在执行 FileSearch 而不是 RegistrySearch。我通过查看安装日志发现,FileSearch 的版本需要用双引号括起来 - 至少对我来说是这样。
  • 哇,是的,我完全对此一无所知,重新阅读您的问题,我根本不会使用“InstallCondition”。我从不在我的引导程序包中使用它。它不会做你期望它做的事情。看起来通过文件搜索你确实得到了一个“版本”变量,所以因为至少有一个版本是条件下的版本,所以它会进行版本比较,所以你都很好。
  • 我将删除 InstallCondition - 看看是否有帮助。谢谢。
  • 我试图让答案与更新相关。 InstallCondition 一直是一个臭名昭著的创作包的挫折。
  • 我还强烈考虑将 Chrome ExePackage 标记为永久性并将您的版本比较更新为gt;= 而不仅仅是=,因为它会尝试降级较新版本的chrome。
猜你喜欢
  • 2017-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-18
  • 2014-01-31
  • 2019-12-13
  • 1970-01-01
相关资源
最近更新 更多