无论DetectCondition,InstallCondition,安装或卸载

时间:2017-09-20 13:10:38

标签: wix installer bundle

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

我的问题特别涉及链元素中描述的ExePackage。似乎有几个(但不是全部)ExePackages总是安装,无论DetectCondition,InstallCondition,Install和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

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

问题是由ExePackage

上的InstallCondition引起的
  

安装软件包之前要评估的条件。只有在条件计算结果为true时才会安装该程序包。如果条件评估为false并且正在安装,修复或修改软件包,则将卸载软件包。

在您的日志中,您可以看到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 infront告诉wix将条件评估为两个版本变量。所有RegistrySearch变量都是String变量,并根据变量本身的格式评估条件中变量之间的比较。由于注册表搜索始终是一个字符串,因此表达式中的另一个操作数决定了发生什么类型的比较。