WIX If...else условие использования реестра

Я пытаюсь использовать условие if... else в WIX, проверяя значение реестра.

<Property Id="WINDOWS_VERSION">
  <RegistrySearch Id='WinVersion' Type='raw'
    Root='HKLM' Key='SOFTWARE\Microsoft\Windows NT\CurrentVersion' Name='ProductName' />
</Property>

<?if [WINDOWS_VERSION] = "Windows 10 Enterprise"?>
        <Directory Id="INSTALLDIR" Name="ETMS">
      <Directory Id ="BinDir" Name ="BIN">
        <Directory Id ="AssemblyDir" Name ="Assembly">
          <Component Id ="BinAssemblyFilesFse" Guid ="$(var.BinAssemblyFilesGuid)">
            <!-- This section should include any files that need to be deployed to Bin Assembly folder -->
            <?include BinAssemblyFiles.wxi?>
          </Component>
          <!-- Due to a bug in WIX, the shortcut is always pointing to the first file in a component
           as a result shortcuts need to be put in their own components. -->
          <Component Id="MainExecutable" Guid="$(var.MainExecutableGuid)">
            <File Id="EtmsFse.exe" Name ="EtmsFse.exe" Source ="$(var.BuiltComponents)">
              <!-- Add shortcut for this file to the created ETMS Program Menu Folder. -->
              <Shortcut Advertise="yes" Id="StartMenuEtmsFse" Directory="EtmsProgramMenuDir" Name="ETMS"
                        WorkingDirectory='Bin' Icon="EtmsFse.exe" IconIndex="0" >
                <!-- Set the AppID in order to get toasts to work -->
                <ShortcutProperty Key="System.AppUserModel.ID" Value="FSE"></ShortcutProperty>
                <!-- Set the ToastActivatorCLSID in order to get notifications working in Action Center -->
                <ShortcutProperty Key="System.AppUserModel.ToastActivatorCLSID" Value="{3BD0C45A-B130-4709-BF6F-E786195E7FF9}"></ShortcutProperty>
              </Shortcut>
              <Shortcut Advertise="yes" Id="desktopEtmsFse" Directory="DesktopFolder" Name="ETMS"
                        WorkingDirectory='Bin' Icon="EtmsFse.exe" IconIndex="0" >
                <!-- Set the AppID in order to get toasts to work -->
                <ShortcutProperty Key="System.AppUserModel.ID" Value="FSE"></ShortcutProperty>
                <!-- Set the ToastActivatorCLSID in order to get notifications working in Action Center -->
                <ShortcutProperty Key="System.AppUserModel.ToastActivatorCLSID" Value="{3BD0C45A-B130-4709-BF6F-E786195E7FF9}"></ShortcutProperty>
              </Shortcut>
            </File>
            <RemoveFolder Id="DelProgramMenuDir" On="uninstall" Directory="EtmsProgramMenuDir"/>
          </Component>
        </Directory>
<?else?>
        <Directory Id="INSTALLDIR" Name="ETMS">
      <Directory Id ="BinDir" Name ="BIN">
        <Directory Id ="AssemblyDir" Name ="Assembly">
          <Component Id ="BinAssemblyFilesFse" Guid ="$(var.BinAssemblyFilesGuid)">
            <!-- This section should include any files that need to be deployed to Bin Assembly folder -->
            <?include BinAssemblyFiles.wxi?>
          </Component>
          <!-- Due to a bug in WIX, the shortcut is always pointing to the first file in a component
           as a result shortcuts need to be put in their own components. -->
          <Component Id="MainExecutable" Guid="$(var.MainExecutableGuid)">
            <File Id="EtmsFse.exe" Name ="EtmsFse.exe" Source ="$(var.BuiltComponents)">
              <!-- Add shortcut for this file to the created ETMS Program Menu Folder. -->
              <Shortcut Advertise="yes" Id="StartMenuEtmsFse" Directory="EtmsProgramMenuDir" Name="ETMS"
                        WorkingDirectory='Bin' Icon="EtmsFse.exe" IconIndex="0" >

              </Shortcut>
              <Shortcut Advertise="yes" Id="desktopEtmsFse" Directory="DesktopFolder" Name="ETMS"
                        WorkingDirectory='Bin' Icon="EtmsFse.exe" IconIndex="0" >

              </Shortcut>
            </File>
            <RemoveFolder Id="DelProgramMenuDir" On="uninstall" Directory="EtmsProgramMenuDir"/>
          </Component>
        </Directory>
<?endif?>

Я очень уверен, что значение I из реестра - "Windows 10 Enterprise", но почему-то оно не соответствует условию if. Кто-нибудь знает, что с ним не так?

Спасибо!

[Обновление] Я хотел добавить уведомление Toast, но эта функция доступна только начиная с Windows 8. Поэтому я пытаюсь выполнить условие if... else, чтобы проверить версию Windows. Для уведомления о тосте нужна строка ниже...

 <!-- Set the AppID in order to get toasts to work -->
            <ShortcutProperty Key="System.AppUserModel.ID" Value="FSE"></ShortcutProperty>
            <!-- Set the ToastActivatorCLSID in order to get notifications working in Action Center -->
            <ShortcutProperty Key="System.AppUserModel.ToastActivatorCLSID" Value="{3BD0C45A-B130-4709-BF6F-E786195E7FF9}"></ShortcutProperty>

2 ответа

Решение

Как указал Брайан, вы используете конструктор / директиву препроцессора, которая влияет только на вещи во время компиляции. Эти конструкции полезны, если вы хотите скомпилировать отдельный MSI для корпоративных компонентов - используя тот же источник WiX, который вы используете для компиляции других выпусков MSI. Если вы хотите поместить все в одну настройку, вы обычно прибегаете к использованию функций.

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

Недавно я написал пару ответов, в которых описывается использование функций, возможно, я просто сделаю ссылку на них:

По сути, вы можете использовать INSTALLLEVEL и механизм уровня установки функций, описанный во второй ссылке выше, чтобы просто определить условие функции для рассматриваемой функции. Однако иногда этот подход дает сбой во время развертывания, поскольку упаковщики корпоративных приложений максимально используют свойство INSTALLLEVEL, чтобы предотвратить установку каких-либо функций (неправильная практика, но очень распространенная). Насколько это серьезно, зависит от продукта. В некоторых случаях он может устанавливать файлы, которые никогда не должны устанавливаться - например, функции Tablet OS или в старые времена версии ANSI файлов, которые должны быть Unicode - и были другие примеры, которые меня избегали.

Помимо технических проблем, таких как перечисленные, некоторые функции могут содержать компоненты, которые небезопасны для установки пользователям, которым они не нужны. Например, средства отладки для разработчиков - вероятно, они не должны быть доступны для всех по соображениям безопасности, а также потому, что они занимают много дискового пространства и машинных ресурсов.

Альтернатива состоит в том, чтобы использовать настраиваемое действие, чтобы программно изменить выбор функции во время выполнения после прямой проверки системы. Оба вышеуказанных подхода описаны в ссылках выше. Особенно во второй ссылке.

Наконец, как вы увидите по одной из приведенных выше ссылок, вы можете создать загрузчик setup.exe, который установит корпоративный MSI, если пользователь устанавливает ОС на предприятии.

Короче говоря: объедините все в одной и той же настройке, используя функции, и каким-либо образом управляйте выбором функций для установки (условия функций, настраиваемые действия) или скомпилируйте отдельные установки с обычными и корпоративными компонентами, соответственно, используя конструкции препроцессора. Затем вы можете установить файлы MSI с помощью загрузчика / загрузчика setup.exe интеллектуальным способом, при котором вы пропустите установку корпоративного MSI, если он не нужен.


Быстрый Макет

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

<Property Id="MYCHECK">
  <RegistrySearch Id='WinVersion' Type='raw'
    Root='HKLM' Key='SOFTWARE\Microsoft\Windows NT\CurrentVersion' Name='ProductName' />
</Property>
<Feature Id="TestFeature" Title="TestFeature" Level="0">
  <Condition Level="1"><![CDATA[MYCHECK="Windows 10 Enterprise" OR ACTION="ADMIN"]]></Condition>
  <!--<ComponentGroupRef Id="TestComponents" />-->
</Feature>

ОБНОВЛЕНИЕ: Тестирование показывает, что любая функция установлена ​​на Level=0 по умолчанию не будет извлечен во время административной установки вообще, независимо от каких-либо условий функции, устанавливающих функцию для установки. Я предполагаю, что предварительный вывод состоит в том, чтобы не устанавливать какие-либо функции Level=0, но установить Level=1 а затем установите их Level=0 с условием, которое оценивается как истинное. Таким образом, эта функция может быть скрыта при обычной установке, но все функции - со связанными файлами - извлекаются во время установки администратора. OR ACTION="ADMIN") часть условия оказывается ненужной. Оставив образец выше как сейчас.

Несколько вещей, на которые стоит обратить внимание:

  • По умолчанию INSTALLLEVEL за WiX Настройки кажутся равными 1. Каждая функция имеет атрибут уровня (см. выше). Если уровень функции объекта равен или ниже, чем INSTALLLEVEL, это по умолчанию для установки. В противном случае он отменен по умолчанию.
  • Установка уровня функции на 0 - как я делаю выше - предотвратит его отображение, и я полагаю, его установку (возможно, также, если ADDLOCAL установлен в ALL - техническая деталь, пока не переживай).
  • Так что установка TestFeature уровень до 0, должен препятствовать его отображению и установке, если ваше состояние не оценивается как истинное (мы находимся на компьютере Enterprise).
  • Если условие выполнено, уровень функции устанавливается равным уровню, указанному в условии. В этом случае 1 - этого достаточно, чтобы показать его и установить по умолчанию для установки.
  • ОБНОВЛЕНИЕ: Этот раздел не на 100% правильный. Пожалуйста, прочитайте блок цитаты в цвете выше. Обратите внимание OR в состоянии. Я пытаюсь объяснить тот факт, что особенность с уровнем 0 очевидно, не будет установлен административной установкой. У меня не было времени проверить это - это случится завтра. Это условие должно выполняться при административных установках на всех компьютерах, даже если они не являются установками Enterprise.

Как вы понимаете, здесь есть что проверить, чего я сейчас не могу сделать. Пожалуйста, попробуйте это и проверьте. Я также не уверен, что способ получения версии для Windows 10 является правильным, и что он будет работать во всех регионах. Как вы думаете, что ключ читает на китайском, корейском или арабском языке, например? Это может быть то же самое, но как мы узнаем? DWORD или подобное было бы более надежным.

Есть несколько форумов, посвященных развертыванию (только небольшой выбор в верхней части моей головы) - где вы можете проверить для получения дополнительной информации:


Ссылки:

Это директивы препроцессора, которые оцениваются во время компиляции, а не во время выполнения. Только та часть, которая соответствует действительности во время компиляции, даже включена в ваш окончательный MSI.

Вот больше информации о WIX Препросссор.

Я не знаю, что вы пытаетесь сделать в бла-бла-секциях, но вам, вероятно, просто нужно будет управлять вещами в зависимости от значения реестра, который вы только что прочитали. Обновите вопрос тем, что вы на самом деле пытаетесь сделать в if if, и я могу обновить ответ (если я помню) примером того, что вы пытаетесь сделать.

Другие вопросы по тегам