Как определить, что установщик Windows выполняет обновление, а не установку в первый раз? - PullRequest
4 голосов
/ 28 сентября 2008

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

Я использую Wise Installer, но я не думаю, что это имеет значение. Я предполагаю, что установщик Windows имеет свойство, которое устанавливается, когда установщик находится в режиме обновления. Я просто не могу найти это. Если свойство существует, я предполагаю, что смогу использовать его в условном выражении.

Ответы [ 3 ]

2 голосов
/ 28 сентября 2008

Можете ли вы рассказать, какие инструменты вы используете для создания этого установщика?

Я использую установщик Windows XML ( WIX ). В WIX вы можете сделать что-то вроде этого:

  <!-- Property definitions -->
  <?define SkuName = "MyCoolApp"?>
  <?define ProductName="My Cool Application"?>
  <?define Manufacturer="Acme Inc."?>
  <?define Copyright="Copyright © Acme Inc. All rights reserved."?>
  <?define ProductVersion="1.1.0.0"?>
  <?define RTMProductVersion="1.0.0.0" ?>
  <?define UpgradeCode="{EF9D543D-9BDA-47F9-A6B4-D1845A2EBD49}"?>
  <?define ProductCode="{27EA5747-9CE3-3F83-96C3-B2F5212CD1A6}"?>
  <?define Language="1033"?>
  <?define CodePage="1252"?>
  <?define InstallerVersion="200"?>

И определить параметры обновления:

<Upgrade Id="$(var.UpgradeCode)">
      <UpgradeVersion Minimum="$(var.ProductVersion)"
              IncludeMinimum="no"
              OnlyDetect="yes"
              Language="$(var.Language)"
              Property="NEWPRODUCTFOUND" />

      <UpgradeVersion Minimum="$(var.RTMProductVersion)"
              IncludeMinimum="yes"
              Maximum="$(var.ProductVersion)"
              IgnoreRemoveFailure="no"
              IncludeMaximum="no"
              Language="$(var.Language)"
              Property="OLDIEFOUND" />

</Upgrade>

Затем вы можете использовать свойства OLDIEFOUND и NEWPRODUCTFOUND в зависимости от того, что вы хотите сделать:

<!-- Define custom actions -->
<CustomAction   Id="ActivateProduct" 
            Directory='MyCoolAppFolder' 
            ExeCommand='"[MyCoolAppFolder]activateme.exe"' 
            Return='asyncNoWait' 
        Execute='deferred'/>

<CustomAction   Id="NoUpgrade4U" 
            Error="A newer version of MyCoolApp is already installed."/>

Определенные выше действия должны быть определены в InstallExcecuteSequence

<InstallExecuteSequence>
    <Custom Action="NoUpgrade4U" 
        After="FindRelatedProducts">NEWPRODUCTFOUND</Custom>
    <Custom Action="ActivateProduct" 
        OnExit='success'>NOT OLDIEFOUND</Custom>
</InstallExecuteSequence>
1 голос
/ 29 сентября 2008

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

Вы также можете проверить эти другие состояния установки MSI свойства , если один из них будет работать лучше. Я никогда не использовал Wise, но я предполагаю, что есть способ получить эти свойства.

0 голосов
/ 28 сентября 2008

Я не уверен, что понял ваш вопрос.
Если вы пишете скрипт установки самостоятельно, лучший способ для Windows - проверить ключи реестра, которые обычно создает такая программа. В отличие от каталога установки (и пунктов меню «Пуск» и т. Д.), Он является инвариантом. Одним из этих ключей может быть даже номер версии программного обеспечения, чтобы проверить, пытается ли пользователь установить более старую версию (или узнать, нужно ли удалять некоторые файлы и т. Д.).

...