2017-09-20 89 views
0

我的沮丧程度接近10.我一直在使用wix安装程序数周。该安装程序会为我们的软件安装先决条件。我没有Visual Studio,所以我创建了一个批处理文件来构建(只读命令行)wix项目。该软件包中包含约9个先决条件,其中包括.msi,.msu和.exe文件。永久安装Wix ExePackage无论在检测条件,安装条件,安装或卸载时都会安装

我的问题特别涉及链元素中描述的ExePackage。似乎有几个(但不是全部)ExePackage总是安装,无论是在安装时还是在Unistall上的DetectCondition,InstallCondition。日志文件显示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> 
... 

这里是从日志文件中“铬”的所有实例:

[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 

在此先感谢您的帮助。

+0

对于'InstallCondition':如果条件计算结果为false并且正在安装,修复或修改软件包,则软件包将被卸载。这意味着它应该试图卸载软件包,但没有提供卸载命令。我想这意味着bundle正在执行安装程序,其中有一些安装程序忽略的参数。尝试添加一个'UninstallCommand',其中包括删除ChromeStandaloneSetup64-v51.0.2704.103.exe所需的任何参数(如果甚至可能的话)。 – philselmer

+1

实际上,我认为你可以直接移除'InstallCondition',因为如果'DetectCondition'评估为false(或者被忽略),这个包只会安装包。 “Burn使用此条件来确定如何在捆绑操作期间处理此包;例如,如果此条件为false或未安装,并且正在安装捆绑包,则Burn将安装此包。” – philselmer

+0

谢谢philselmer。删除InstallCondition的确奏效。我写了Brian Sutherland的回答是正确的,因为他写的是一个答案。感谢您的回应。 – Scottlysan

回答

1

的问题正在对你ExePackage

安装软件包之前评估的条件造成InstallCondition。只有当条件评估为真时才会安装该软件包。如果条件评估为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变量都是字符串变量,并且根据变量本身的格式对条件中变量之间的比较进行评估。由于注册表搜索始终是一个字符串,因此表达式中的另一个操作数将确定发生什么类型的比较。

+0

我正在做一个FileSearch而不是RegistrySearch。我通过查看安装日志发现,FileSearch的版本需要用双引号引起来 - 至少这对我来说一直有效。 – Scottlysan

+0

哇是啊,我完全只是空白,重新读你的问题,我根本就不使用“InstallCondition”。我从来没有在我的引导程序包中使用它。它不会做你期望它做的事。它看起来像文件搜索,你会得到一个“版本”变量,因为至少有一个版本是在版本比较的情况下进行版本比较的,所以你都很好。 –

+0

我将删除InstallCondition - 看看是否有帮助。谢谢。 – Scottlysan