2017-09-20 255 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