Wix ExePackage 始终安装,无论 DetectCondition、InstallCondition、安装或卸载

Wix ExePackage always installs regardless of DetectCondition, InstallCondition, on install, or uninstall

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

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

在过去两周的沮丧中,我在 Whosebug 上的某处读到,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 Cache02865AE2381BC34E91C107DA5818CF971356E8\ChromeStandaloneSetup64-v51.0.2704.103.exe.
[01B4:0F1C][2017-09-20T06:31:19]i301: Applying execute package: Chrome, action: Uninstall, path: C:\ProgramData\Package Cache02865AE2381BC34E91C107DA5818CF971356E8\ChromeStandaloneSetup64-v51.0.2704.103.exe, arguments: '"C:\ProgramData\Package Cache02865AE2381BC34E91C107DA5818CF971356E8\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 Cache02865AE2381BC34E91C107DA5818CF971356E8\
[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

在此先感谢您的帮助。

问题是由 ExePackage

上的 InstallCondition 引起的

A condition to evaluate before installing the package. The package will only be installed if the condition evaluates to true. If the condition evaluates to false and the bundle is being installed, repaired, or modified, the package will be uninstalled.

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

但是 InstallCondition 被评估为 false

[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 变量都是字符串变量,条件中变量之间的比较根据变量本身的格式进行评估。由于注册表搜索始终是一个字符串,表达式中的另一个操作数决定了比较的类型。