Wix Burn: сброс переменной при неудачном поиске в реестре - PullRequest
0 голосов
/ 30 августа 2018

В моем проекте Bundle я ищу в реестре версию и задаю переменную:

<Variable Name="Installed_Ver" bal:Overridable="yes" Type="version" Value="0.0.0.0" Persisted="yes" />

<util:RegistrySearch
  Id="Self_Ver"
  Root="HKLM"
  Key="Software\MyCompany\MyProductName"
  Value="Version"
  Variable="Installed_Ver"  
  Format="raw"
  Win64="yes"

/>

И используя это в условии как:

<util:RegistrySearchRef Id="Self_Ver"  />
<bal:Condition Message="A recent or same version of this product is already installed on this machine. Please contact product support for more information." >
  <![CDATA[WixBundleInstalled OR (WixBundleFileVersion > Installed_Ver)]]>
</bal:Condition>

Это нормально работает, если существует HKLM \ Software \ MyCompany \ MyProductName \ Version. Но если этот реестр не существует, то поиск в реестре не удастся, и он отменяет установку переменной 'Installed_Ver'. Это приводит к тому, что условие ошибочно оценивается как ложное.

Определив, я попытался установить значение по умолчанию, то есть "0.0.0.0", чтобы оно имело какое-то значение, и условие было бы правильно оценено, т.е. в данном случае в True.

Вот журнал, который показывает, что он отменяет сброс переменной 'Installed_Ver'.

[5898: 2AC4] [2018-08-30T13: 15: 08] i000: установка строковой переменной 'WixBundleName' в значение 'RegVersionCheck' [5898: 2AC4] [2018-08-30T13: 15: 08] i000: установка строковой переменной 'WixBundleManufacturer' в значение 'Тестирование' [5898: 3354] [2018-08-30T13: 15: 08] i000: установка числовой переменной 'WixStdBALanguageId' в значение 1033 [5898: 3354] [2018-08-30T13: 15: 08] i000: установка переменной версии 'WixBundleFileVersion' в значение '7.1.2.3' [5898: 2AC4] [2018-08-30T13: 15: 08] i100: Обнаружение начала, 1 упаковка [5898: 2AC4] [2018-08-30T13: 15: 08] i000: ключ реестра не найден. Key = 'Software \ MyCompany \ MyProductName' [5898: 2AC4] [2018-08-30T13: 15: 08] i000: Сброс переменной 'Installed_Ver' [5898: 2AC4] [2018-08-30T13: 15: 08] i101: Обнаружен пакет: MainProduct, состояние: отсутствует, кэшируется: нет [5898: 2AC4] [2018-08-30T13: 15: 08] i104: обнаружен пакет: MainProduct, функция: CalculatorFeature, состояние: отсутствует [5898: 2AC4] [2018-08-30T13: 15: 08] i052: условие «WixBundleInstalled ИЛИ (WixBundleFileVersion> Installed_Ver)» оценивается как ложное. [5898: 2AC4] [2018-08-30T13: 15: 08] e000: на этом компьютере уже установлена ​​последняя или та же версия этого продукта. Пожалуйста, свяжитесь со службой поддержки для получения дополнительной информации. [5898: 2AC4] [2018-08-30T13: 15: 08] e000: Ошибка 0x81f40001: условие пакета оценено как ложное: WixBundleInstalled ИЛИ (WixBundleFileVersion> Installed_Ver) [5898: 2AC4] [2018-08-30T13: 15: 08] i199: обнаружение завершено, результат: 0x0

Я попытался жестко закодировать "0.0.0.0" в состоянии вместо Installed_Ver, и он работает нормально.

Как получить значение по умолчанию для Installed_Ver, если поиск в реестре завершился неудачей?

Спасибо

Ответы [ 2 ]

0 голосов
/ 31 августа 2018

После еще нескольких поисков я нашел небольшой обходной путь, чтобы я мог использовать значение по умолчанию (0.0.0.0), устанавливаемое в определении переменной. Я определил другой поиск по тому же ключу реестра и получил логическую (существующую) переменную, и в зависимости от этой переменной решил инициировать первоначальный поиск и получить значение версии. Вот мое решение:

<Fragment Id="Self_Install_Check">

<?define ProdRegKey=Software\MyCompany\MyProductName?>
<Variable Name="Installed_Ver" bal:Overridable="yes" Type="version" Value="0.0.0.0" Persisted="yes" />

<util:RegistrySearch
  Id="Self_Ver"
  After="ProdRegExist"
  Condition="ProdRegKeyExist"
  Root="HKLM"
  Key="$(var.ProdRegKey)"
  Value="Version"
  Variable="Installed_Ver"
  Format="raw"
  Win64="yes"
/>

<util:RegistrySearch
  Id="ProdRegExist"
  Root="HKLM"
  Key="$(var.ProdRegKey)"
  Value="Version"
  Variable="ProdRegKeyExist"
  Result="exists"
  Format="raw"
  Win64="yes"
/>
</Fragment>

Таким образом, теперь поиск в реестре для чтения версии будет запускаться только в том случае, если ProdRegKeyExist станет истинным, и Installed_Ver не будет сброшено при сохранении значения = 0.0.0.0, иначе будет получено значение Version из реестра ...

0 голосов
/ 30 августа 2018

Это открытая ошибка . Вы сможете обойти это, обновив свое условие для обработки, когда переменная не определена.

WixBundleInstalled OR ((WixBundleFileVersion > Installed_Ver) AND Installed_Ver)
...