Как установить флажок "unchecked" из командной строки msiexec?

У меня есть 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. Это делает сценарий более сложным и вероятно, я не смогу переопределить значение флажка, который по умолчанию имеет значение "checked".
  2. из @Michael Urman добавьте пользовательское действие, которое очищает свойство, если его значение равно нулю. Это делает msi более сложным, и мне пришлось бы добавить такое пользовательское действие для каждого флажка в пользовательском интерфейсе.
  3. другая идея состоит в том, чтобы просто запретить использование флажков в наших установщиках msi и вместо этого использовать радиоприемники или раскрывающиеся списки для вопросов "true/false". В то время как это ограничивает параметры пользовательского интерфейса для наших установщиков, это позволит сценариям оболочки оставаться простыми и не требует пользовательских действий для "взлома" свойств.

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

2 ответов


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

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


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

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