Подтвердить что ты не робот

Запустить после установки без интерфейса?

Как запустить приложение после установки без интерфейса (или в тихом режиме)? Спасибо!


У меня был установщик с пользовательским интерфейсом, который имеет возможность запускать после установки. Теперь я хочу, чтобы мое приложение обновлялось, загружая и запуская новую версию установщика в тихом режиме, но после завершения обновления он не будет запускаться снова.

4b9b3361

Ответ 1

Из темы msdn в последовательность пользовательских действий:

Как и в случае стандартных действий, пользовательские действия, запланированные в InstallUISequence или Администрирование выполняется только в том случае, если внутренний пользовательский интерфейс установлен на полный уровень.

Итак, я предполагаю, что ваше пользовательское действие запланировано в последовательности пользовательского интерфейса, а не в InstallExecuteSequence. Попробуйте настроить свое настраиваемое действие в InstallExecuteSequence следующим образом:

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

где "LaunchApplication" следует заменить на Id вашего элемента CustomAction.

edit. Я посмотрел на инструкции, которые вы выполнили, и я не вижу настраиваемого действия для запуск приложения, запланированного в любой последовательности. Он запускается только из действия пользовательского интерфейса (нажатие кнопки "Готово" ). Это объясняет, почему он никогда не выполняется во время бесшумной установки.

edit: полный образец (он немного неаккуратный, поскольку он также пытается выполнить пользовательское действие при удалении, восстановлении и т.д., но по какой-то причине я не смог получить условие "НЕ установлен" работа)

<?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>

Ответ 2

В моем окончательном решении я использовал два свойства: один для UI (LAUNCH_APP_ON_EXIT), один для аргументов командной строки ( UPDATING_AUTOMATICALLY).

Я должен сделать это, потому что, если я запустил CustomAction после InstallFinalize в полном режиме пользовательского интерфейса, приложение запустится до, нажав кнопку "Готово".

Теперь я могу вызвать 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>

Ответ 3

Я бы предположил, что вы запускаете свое приложение из пользовательского действия, которое запускается через свойство, связанное с этим флажком. Если это так, вы можете попробовать указать это свойство как аргумент командной строки для setup.exe. Скажем, если ваше пользовательское действие связано с свойством MSI LAUNCH_NEW_VERSION, вы можете вызвать setup.exe следующим образом:

setup.exe /q LAUNCH_NEW_VERSION=1

Стандартный загрузочный загрузчик должен передать это свойство/значение движку MSI. Если это не так, вы можете подумать о вызове .msi напрямую, а не при вызове bootstrapper exe для запуска вашего установщика.

Ответ 4

Это подход, который я принял.

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

Это приведет к выполнению идентификатора файла, который вы вводите в значение. Требуется [#]. Я использовал это и запускал его через пользовательский интерфейс, но вы должны иметь возможность вызвать это настраиваемое действие в любом месте и работать.