Wix安装然后立即尝试修复

时间:2013-06-21 16:14:14

标签: wix .net-4.5 burn wix3.7 repair

我正在尝试使用WixStandardBootstrapperApplication运行一个bootstrapper应用程序。到目前为止,它适用于我需要它做的一切,甚至在安装过程中处理重启。这个过程是这样的 - 我检查计算机上是否安装了.net 4.5,如果没有,则安装.net 4.5。安装后,刻录然后知道重启,因为我处理退出代码。恢复后,安装程序会处理另外三个.exe文件,其中一个文件依赖于.net安装。这一切都很好地运行,直到重新启动之后,此时引导程序尝试修复每个exe的post安装,使运行时间加倍。这不会是那么糟糕,除了安装.net 4.5需要很长时间,以至于加倍是非常不受欢迎的。我试过省略一个修复命令,我注意到没有像安装和检测条件那样的任何形式的RepairCondition。有没有办法阻止修复过程?

这是引导程序代码:

<Chain>
      <ExePackage Id="NetFx45Redist" Cache="no" Compressed="yes" PerMachine="yes" Permanent="yes" Vital="yes" InstallCommand="/q /norestart" RepairCommand="/q"
              SourceFile="...\...\Setup Files\dotNetFx45_Full_setup.exe"
              DetectCondition="(Netfx4FullVersion=&quot;4.5.50709&quot;) AND (NOT VersionNT64 OR (Netfx4x64FullVersion=&quot;4.5.50709&quot;))"
              InstallCondition="(VersionNT >= v6.0 OR VersionNT64 >= v6.0) AND (NOT (Netfx4FullVersion=&quot;4.5.50709&quot; OR Netfx4x64FullVersion=&quot;4.5.50709&quot;))"
              RepairCondition="" >
        <ExitCode Value="1641" Behavior="forceReboot"/>
        <ExitCode Value="3010" Behavior="forceReboot"/>
        <ExitCode Value="0" Behavior="success"/>
        <ExitCode Behavior="error"/>
      </ExePackage>
      <ExePackage
        SourceFile="...\...\Setup Files\Encoder_en.exe"
        InstallCommand="/q"
        RepairCommand="/q">
        <ExitCode Behavior="success"/>
      </ExePackage>
      <ExePackage
        SourceFile="...\...\Setup Files\vcredist_x86.exe"
        InstallCommand="/q"
        RepairCommand="/q">
        <ExitCode Behavior="success"/>
      </ExePackage>
      <ExePackage
        SourceFile="...\...\Setup Files\vcredist_x64.exe"
        InstallCommand="/q"
        RepairCommand="/q">
        <ExitCode Behavior="success"/>
      </ExePackage>
      <!-- installer for actual software at some point -->
</Chain>

我知道这些其他.exe的行为是成功的基本上是黑客攻击,但在处理修复问题之前,他们需要安装程序说它失败了。我也试过从这些中删除修复命令,这似乎没有任何帮助,所以我让它们保持安静,所以至少它们不会弹出并使用户感到困惑。

1 个答案:

答案 0 :(得分:2)

对于非DetectCondition的每个包,您需要准确的MsiPackage属性值。 Burn无法检测任意.exe可能会做什么,所以它依赖于你来告诉它。如果没有检测条件,Burn将始终安装包。对于.NET,您应该使用来自WiX的DetectCondition

<?define NetFx45MinRelease = 378389?>
...
  <util:RegistrySearch
      Id="NETFRAMEWORK45"
      Variable="NETFRAMEWORK45"
      Root="HKLM"
      Key="SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full"
      Value="Release"
      Result="value" />
...
DetectCondition="NETFRAMEWORK45 &gt;= $(var.NetFx45MinRelease)"