2009-12-09 92 views
16

如何在没有UI(或安静模式)的情况下安装后启动我的应用程序?谢谢!安装后启动,没有UI?


我有一个UI安装程序,它有安装后运行的选项。现在我希望我的应用程序通过以安静模式下载并运行新版本的安装程序来更新自身,但更新完成后,它不会再次启动。

+0

注意:我正在使用名为LAUNCHAPPONEXIT的属性来控制启动我的应用程序的自定义操作。并且其默认值为1. – deerchao 2009-12-09 06:15:49

+0

以下是我在安装后用于启动的方法:http://www.dizzymonkeydesign.com/blog/misc/adding-and-customizing-dlgs-in-wix-3/ – deerchao 2009-12-09 07:00:41

回答

15

从MSDN主题上sequencing custom actions

作为标准操作的情况下,被安排在 的InstallUISequence或 AdminUISequence运行仅在 内部用户接口被设置为 自定义操作 完整级别。

所以我想你的自定义动作是按照UI顺序安排的,而不是在InstallExecuteSequence。尽量安排您的自定义操作在InstallExecuteSequence这样的:

<InstallExecuteSequence> 
    <Custom Action='LaunchApplication' After='InstallFiles'/> 
    </InstallExecuteSequence> 

其中“LaunchApplication”应该由你的CustomAction元素的Id取代。

编辑:我看着你跟着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> 
+0

我试过: LAUNCH_APP_ON_EXIT 看来我不能使它工作,有或没有UI,即使我拿出条件LAUNCH_APP_ON_EXIT。你能提供一个简单的例子吗? 谢谢! – deerchao 2009-12-12 00:51:29

+0

感谢你的例子。我添加了一个属性UPDATING_AUTOMATICALLY来控制是否运行自定义操作。 – deerchao 2009-12-12 08:03:40

+0

然后我在命令行中传递UPDATING_AUTOMATICALLY = 1。 – deerchao 2009-12-12 08:04:11

1

我会假设你从自定义操作启动你的应用程序,这是通过绑定到复选框的属性触发的。如果是这种情况,您可以尝试将该属性指定为setup.exe的命令行参数。也就是说,如果您的自定义操作绑定到MSI属性LAUNCH_NEW_VERSION,你可以调用SETUP.EXE这样的:

setup.exe /q LAUNCH_NEW_VERSION=1 

标准设置引导程序应该是属性/值传递给MSI引擎。如果没有,你可以考虑直接调用.msi而不是调用bootstrapper exe来运行你的安装程序。

+0

是的,我正在使用名为LAUNCHAPPONEXIT的属性来控制自定义操作,并且其默认值设置为1.但是程序不会以任何方式在安静模式下启动。我试过 setup.exe/q LAUNCHAPPONEXIT = 1 它也不起作用。 – deerchao 2009-12-09 06:11:59

+0

尝试直接通过.msi而不是setup.exe引导程序。 – 2009-12-09 07:25:03

+0

我试了好几次都没有运气: “msiexec/i DepotM.Setup.msi/qn LAUNCHAPPONEXIT = 1” 但是,如果我更改为/ qf(显示完整的UI),它会在安装后运行。/qb也没有工作。 – deerchao 2009-12-09 07:49:28

3

以我最终溶液I中使用的两个属性,一个用于UI(LAUNCH_APP_ON_EXIT),一个用于命令行参数(UPDATING_AUTOMATICALLY)。

我,如果我后运行CustomAction InstallFinalize完全UI模式,这样做是因为,你点击“完成”按钮之前的应用程序将启动。

现在我可以拨打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> 
+0

这非常有帮助。在我的情况下,我想使用标准UI复选框来启动程序*如果* UI显示...但是如果安装程序默默运行,我想自动启动它。将UPDATING_AUTOMATICALLY属性添加到部分至关重要。谢谢! – stuzor 2017-01-22 23:20:56

1

这是我采取的方法。

<Property Id="WixShellExecTarget" Value="[#(the id of your exe here)]" /> 
<CustomAction Id="LaunchApplication" BinaryKey="WixCA" DllEntry="WixShellExec" Impersonate="yes" /> 

这将执行您在Value中输入的任何文件ID。 [#]是必需的。我使用它并通过UI运行它,但你应该能够在任何地方调用这个自定义动作,并且它可以工作。