[英]Wix Burn: How to reboot after installing a MsuPackage
我目前有一個場景,我需要使用刻錄執行以下操作
我想知道在安裝MsuPackage后是否有辦法強制重啟...
在我的方案中,當引導程序在Windows Vista上安裝Windows6.0-KB942288-v2-x86.msu並隨后嘗試安裝.Net Framework而不重新啟動時會拋出錯誤:0x8007064d - Windows安裝程序無法安裝此安裝包服務...
如果我在錯誤后重新啟動並再次運行安裝程序它可以正常工作。 請注意,使用ExePackage可以指定InstallCommand以及ExitCode,如何在MsuPackage中實現相同的行為?
請參閱下面我的wxs文件的內容:
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"
xmlns:bal="http://schemas.microsoft.com/wix/BalExtension"
xmlns:util="http://schemas.microsoft.com/wix/UtilExtension">
<Bundle Name="$(var.MyProject.ProjectName)" Version="2.6.0.0" Manufacturer="Awesome Software (Pty) Ltd" UpgradeCode="6a77118d-c132-4454-850b-935edc287945">
<BootstrapperApplicationRef Id="WixStandardBootstrapperApplication.RtfLicense">
<bal:WixStandardBootstrapperApplication
LicenseFile="$(var.SolutionDir)Awesome.EULA\Awesome CE Eula.rtf"
SuppressOptionsUI="yes"/>
</BootstrapperApplicationRef>
<util:FileSearch Path="[SystemFolder]\windowscodecs.dll" Variable="windowscodecs" Result="exists" />
<Chain>
<!-- Windows Imaging Component-->
<ExePackage Cache="no" Compressed="no" PerMachine="yes" Permanent="yes" Vital="yes"
SourceFile="redist\wic_x86_enu.exe"
DownloadUrl="http://download.microsoft.com/download/f/f/1/ff178bb1-da91-48ed-89e5-478a99387d4f/wic_x86_enu.exe"
InstallCondition="VersionNT < v5.2 AND NOT VersionNT64"
DetectCondition="windowscodecs"
InstallCommand="/quiet /norestart">
</ExePackage>
<ExePackage Cache="no" Compressed="no" PerMachine="yes" Permanent="yes" Vital="yes"
SourceFile="redist\wic_x64_enu.exe"
DownloadUrl="http://download.microsoft.com/download/6/4/5/645FED5F-A6E7-44D9-9D10-FE83348796B0/wic_x64_enu.exe"
InstallCondition="VersionNT < v5.2 AND VersionNT64"
DetectCondition="windowscodecs"
InstallCommand="/quiet /norestart">
</ExePackage>
<!-- Windows Installer 4.5 -->
<ExePackage Cache="no" Compressed="no" PerMachine="yes" Permanent="yes" Vital="yes"
SourceFile="redist\WindowsXP-KB942288-v3-x86.exe"
DownloadUrl="http://download.microsoft.com/download/2/6/1/261fca42-22c0-4f91-9451-0e0f2e08356d/WindowsXP-KB942288-v3-x86.exe"
InstallCondition="VersionNT=v5.1 AND NOT VersionNT64 AND VersionMsi < v4.5"
InstallCommand="/quiet /norestart">
<ExitCode Behavior="forceReboot"/>
</ExePackage>
<ExePackage Cache="no" Compressed="no" PerMachine="yes" Permanent="yes" Vital="yes"
SourceFile="redist\WindowsServer2003-KB942288-v4-x86.exe"
DownloadUrl="http://download.microsoft.com/download/2/6/1/261fca42-22c0-4f91-9451-0e0f2e08356d/WindowsServer2003-KB942288-v4-x86.exe"
InstallCondition="VersionNT=v5.2 AND NOT VersionNT64 AND VersionMsi < v4.5"
InstallCommand="/quiet /norestart">
<ExitCode Behavior="forceReboot"/>
</ExePackage>
<ExePackage Cache="no" Compressed="no" PerMachine="yes" Permanent="yes" Vital="yes"
SourceFile="redist\WindowsServer2003-KB942288-v4-x64.exe"
DownloadUrl="http://download.microsoft.com/download/2/6/1/261fca42-22c0-4f91-9451-0e0f2e08356d/WindowsServer2003-KB942288-v4-x64.exe"
InstallCondition="VersionNT=v5.2 AND VersionNT64 AND VersionMsi < v4.5"
InstallCommand="/quiet /norestart">
<ExitCode Behavior="forceReboot"/>
</ExePackage>
<MsuPackage Cache="no" Compressed="no" Permanent="yes" Vital="yes" KB="KB942288"
SourceFile="redist\Windows6.0-KB942288-v2-x86.msu"
DownloadUrl="http://download.microsoft.com/download/2/6/1/261fca42-22c0-4f91-9451-0e0f2e08356d/Windows6.0-KB942288-v2-x86.msu"
InstallCondition="VersionNT=v6.0 AND NOT VersionNT64 AND VersionMsi < v4.5">
</MsuPackage>
<MsuPackage Cache="no" Compressed="no" Permanent="yes" Vital="yes" KB="KB942288"
SourceFile="redist\Windows6.0-KB942288-v2-x64.msu"
DownloadUrl="http://download.microsoft.com/download/2/6/1/261fca42-22c0-4f91-9451-0e0f2e08356d/Windows6.0-KB942288-v2-x64.msu"
InstallCondition="VersionNT=v6.0 AND VersionNT64 AND VersionMsi < v4.5">
</MsuPackage>
<PackageGroupRef Id="NetFx40Web"/>
<RollbackBoundary />
<MsiPackage Id="MaxCut" SourceFile=".\StagingBundle\Awesome.msi" DisplayInternalUI="no"/>
</Chain>
</Bundle>
</Wix>
將自動檢測MsuPackage重新啟動。 你安裝的MSU可能已經說它需要重啟(日志文件應該說一些,IIRC),但不需要強制重啟。 已經要求Burn有一種方法可以將“需要重新啟動”提升到“現在重新開始,如果此時需要重新啟動”鏈中。 不幸的是,此時此功能尚不存在。
但是,您可以通過從OnExecutePackageComplete()
回調返回IDRESTART
,在自定義BootstrapperApplication中實現“立即強制重啟”行為。 在有人實現該功能之前,這是唯一的選擇。
我最近需要這樣做,並且不想為每個MSU編寫一個bootstrapper應用程序或創建額外的bootstrapper EXE
作為一種解決方法,我添加了一個不執行任何操作的可執行文件(NOP.EXE),以便在MsuPackage
之后運行並使用ExitCode
強制重新啟動。
您需要使用相同的DetectCondition
同時為MsuPackage
和ExePackage
。
您可以在多個MsuPackages之后使用相同的可執行文件
所以像......
<Fragment>
<util:FileSearch Path="PathToSomeDotNetDll" Result="version" Variable="DotNetVersionCheck" />
<PackageGroup Id="net45_x86">
<MsuPackage Cache="no"
Compressed="no"
DetectCondition="DotNetVersionCheck >= v4.5"
Permanent="yes"
Vital="yes"
KB="KB942288"
SourceFile="redist\Windows6.0-KB942288-v2-x86.msu"
DownloadUrl="http://download.microsoft.com/download/2/6/1/261fca42-22c0-4f91-9451-0e0f2e08356d/Windows6.0-KB942288-v2-x86.msu"
InstallCondition="VersionNT=v6.0 AND NOT VersionNT64 AND VersionMsi < v4.5">
</MsuPackage>
<!-- Trick the bootstrapper into rebooting now by running an executable that does nothing and set ExitCode to force a reboot -->
<ExePackage SourceFile="bin\nop.exe"
DisplayName="Reboot required after KB942288"
DetectCondition="DotNetVersionCheck >= v4.5"
InstallCommand="nop.exe"
InstallCondition="VersionNT=v6.0 AND NOT VersionNT64 AND VersionMsi < v4.5"
Permanent="yes">
<ExitCode Behavior="forceReboot"/>
</ExePackage>
</PackageGroup>
</Fragment>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.