如何在没有UI(或安静模式)的情况下安装后启动我的应用程序?谢谢!
我有一个带UI的安装程序,可以选择在安装后运行。现在我希望我的应用程序通过在安静模式下下载并运行新版本的安装程序来更新自己,但在更新完成后,它将不会再次启动。
答案 0 :(得分:15)
来自sequencing custom actions上的msdn主题:
与标准行动的情况一样, 计划中的自定义操作 InstallUISequence或 AdminUISequence仅在运行时运行 内部用户界面设置为 满级。
所以我猜您的自定义操作是按照UI顺序安排的,而不是InstallExecuteSequence
。尝试在InstallExecuteSequence
中安排自定义操作,如下所示:
<InstallExecuteSequence>
<Custom Action='LaunchApplication' After='InstallFiles'/>
</InstallExecuteSequence>
其中“LaunchApplication”应替换为Id
元素的CustomAction
。
编辑:我查看了您所关注的instructions,但我没有看到以任何顺序启动正在安排的应用程序的自定义操作。它仅从UI动作触发(单击“完成”按钮)。这解释了为什么在静默安装期间永远不会执行它。
编辑:完整示例(它有点草率,因为它还尝试在卸载,修复等时执行自定义操作但由于某种原因我无法获得“未安装”条件工作)
<?xml version='1.0' encoding='utf-8'?>
<Wix xmlns='http://schemas.microsoft.com/wix/2006/wi'>
<Product
Name='ProductName'
Id='*'
Language='1033'
Version='0.0.1'
Manufacturer='ManufacturerName' >
<Package
Keywords='Installer'
Description='Launch application demo'
Manufacturer='ManufactererName'
InstallerVersion='100'
Languages='1033'
Compressed='yes'
SummaryCodepage='1252'/>
<Media Id='1' Cabinet='test.cab' EmbedCab='yes'/>
<Directory Id='TARGETDIR' Name="SourceDir">
<Directory Id='ProgramFilesFolder'>
<Directory Id='TestFolder' Name='Test' >
<Component Id="ExeComponent" Guid="*">
<File Id="ExeFile" Source="c:\windows\notepad.exe" />
</Component>
</Directory>
</Directory>
</Directory>
<Feature Id='Complete'
Display='expand'
Level='1'
Title='Test'
Description='Test'>
<ComponentRef Id="ExeComponent" />
</Feature>
<InstallExecuteSequence>
<Custom Action='LaunchInstalledExe' After='InstallFinalize'/>
</InstallExecuteSequence>
<CustomAction Id="LaunchInstalledExe"
FileKey="ExeFile"
ExeCommand=""
Execute="immediate"
Impersonate="yes"
Return="asyncNoWait" />
</Product>
</Wix>
答案 1 :(得分:3)
在我的最终解决方案中,我使用了两个属性,一个用于UI( LAUNCH_APP_ON_EXIT ),一个用于命令行参数( UPDATING_AUTOMATICALLY )。
我必须这样做,因为如果我在完全UI模式下在 InstallFinalize 之后运行CustomAction,应用程序将在开始之前单击“完成”按钮。
现在我可以在程序中调用 setup.exe / qn UPDATING_AUTOMATICALLY = 1 进行更新。
就是这样:
<Property Id="LAUNCH_APP_ON_EXIT" Value="1" />
<Property Id="UPDATING_AUTOMATICALLY" Value ="0" />
<CustomAction Id="LaunchApplication" FileKey="mainExecutableFile" ExeCommand="" Execute="immediate" Impersonate="yes" Return="asyncNoWait" />
<UI>
<!-- explainations: http://www.dizzymonkeydesign.com/blog/misc/adding-and-customizing-dlgs-in-wix-3/ -->
<UIRef Id="MyWixUI_InstallDir" />
<UIRef Id="WixUI_ErrorProgressText"/>
<Publish Dialog="MyExitDialog" Control="Finish" Order="1" Event="DoAction" Value="LaunchApplication">LAUNCH_APP_ON_EXIT</Publish>
</UI>
<InstallExecuteSequence>
<Custom Action='LaunchApplication' After='InstallFinalize'>UPDATING_AUTOMATICALLY = 1</Custom>
</InstallExecuteSequence>
答案 2 :(得分:1)
我认为您是从自定义操作启动应用程序,该操作是通过绑定到复选框的属性触发的。如果是这种情况,您可以尝试将该属性指定为setup.exe的命令行参数。比如,如果您的自定义操作绑定到MSI属性LAUNCH_NEW_VERSION,则可以像这样调用setup.exe:
setup.exe /q LAUNCH_NEW_VERSION=1
标准安装引导程序应将该属性/值传递给MSI引擎。如果没有,您可以考虑直接调用.msi而不是调用bootstrapper exe来运行安装程序。
答案 3 :(得分:1)
这是我采取的方法。
<Property Id="WixShellExecTarget" Value="[#(the id of your exe here)]" />
<CustomAction Id="LaunchApplication" BinaryKey="WixCA" DllEntry="WixShellExec" Impersonate="yes" />
这将执行您在Value中输入的任何文件ID。需要[#]。我使用它并通过UI运行它,但你应该可以在任何地方调用这个自定义操作并且它可以工作。