Как установить флажок «снят» с командной строки msiexec? - PullRequest
7 голосов
/ 07 июня 2010

У меня есть msi (созданный с WIX), у которого есть флажок, связанный с пользовательским свойством (назовите его MY_PROPERTY). Я хотел бы запустить этот MSI из командной строки, указав 0 (не проверено) или 1 (проверено) для этого свойства. Мой сценарий определит соответствующее значение (в зависимости от среды) и вставит это значение в командную строку msiexec. Моя командная строка выглядит примерно так:

msiexec /i my_installer.msi MY_PROPERTY=$value

Где $ value равно 1 или 0, в зависимости от среды. Проблема в том, что независимо от того, какое значение я предоставляю для MY_PROPERTY в командной строке, флажок всегда устанавливается (и свойство всегда будет установлено в 1). Единственный способ снять этот флажок - не указывать свойство (оставьте его неопределенным). Следует отметить, что это происходит независимо от того, показывает ли пользовательский интерфейс (добавление «/ quiet» в приведенную выше командную строку не меняет это поведение).

Это сообщение MSDN , похоже, указывает на то, что это известная "ошибка" в установщике Windows (или, точнее, в любой авторской системе, написавшей msi). В качестве решения предлагается MSI-взлом после сборки. Мне интересно, сталкивался ли кто-нибудь с этой проблемой и придумал лучший обходной путь / решение. Спасибо!

Обновление

Я вижу три решения этой проблемы:

  1. От @Damien, чтобы скрипт-обёртка не передавал свойство в msiexec, когда его значение равно 0. Это делает скрипт более сложным и, вероятно, помешало бы мне переопределить значение флажка, который по умолчанию установлен на ».
  2. От @Michael Urman добавьте настраиваемое действие, которое очищает свойство, если его значение равно нулю. Это делает MSI более сложным, и мне пришлось бы добавлять такое настраиваемое действие для каждого флажка в пользовательском интерфейсе.
  3. Другая идея состоит в том, чтобы просто запретить использование флажков в наших установщиках msi и использовать вместо них переключатели или раскрывающиеся списки для вопросов «истина / ложь». Хотя это ограничивает параметры пользовательского интерфейса для наших установщиков, оно позволяет сценариям-оболочкам оставаться простыми и не требует специальных действий для «взлома» свойств.

В настоящее время я склоняюсь к варианту 3, хотя вариант 1, вероятно, является лучшим ответом на мой исходный вопрос. Есть мысли?

Ответы [ 2 ]

8 голосов
/ 08 июня 2010

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

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

5 голосов
/ 08 июня 2010

Как вы обнаружили, флажки имеют значение true (проверено), когда свойство определено (не пусто), и false (не проверено), когда свойство не определено (пусто). Похоже, вам нужно преобразовать строку окружения 1 или 0 в флажок true / false, где 1 или 0 передается в командной строке. Попробуйте использовать настраиваемое действие set-property, которое устанавливает для вашего свойства значение {} (пусто) с условием, когда свойство уже имеет значение "0". Запланируйте это на ранних этапах как в интерфейсе установки, так и в последовательности установки.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...