gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 16:46:57 25 4
gpt4 key购买 nike

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

我的问题具体涉及链元素中描述的 ExePackage。不管 DetectCondition、InstallCondition、on Install 和 Unistall,似乎有几个(但不是全部)ExePackages 总是安装。日志文件显示 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

预先感谢您的帮助。

最佳答案

问题是由您的 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”,因此 bundle 确实检测到安装了正确版本的 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

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

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


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

CHROMEVERSION gt;= v51.0.2704.103

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

关于Wix ExePackage 始终安装,无论 DetectCondition、InstallCondition、安装或卸载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46322994/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com