Как заставить msiexec установить и / или переустановить при необходимости - PullRequest
3 голосов
/ 27 апреля 2011

У меня есть внутренний MSI, размещенный на сетевом диске, и я хотел бы написать сценарий входа в систему, чтобы любой в нашей сети мог установить MSI на свои компьютеры или автоматически переустановить его, когда MSIобновляется (что часто случается).

Если я использую msiexec.exe /i REINSTALL=ALL, это ничего не изменит, если MSI еще не установлен на этом компьютере.Если я пропущу REINSTALL=ALL, то он будет делать новые установки, но не будет обновлять / переустанавливать.

Какие параметры я должен выбрать, чтобы он делал новую установку, если пакет еще не установлен, и полную переустановку, если пакет уже установлен?

Первый запуск msiexec /iпосле этого может сработать переустановка, но я бы хотел избежать этого, если это возможно.

РЕДАКТИРОВАТЬ: Причина /famus необходима в том, что это машины разработчика, и кто-то может вручную обновить реестр или зарегистрироватьдругой набор DLL.Сценарий заключается в том, что, даже если в MSI не было никаких изменений, разработчик также может запустить сценарий, чтобы легко вернуться в «официальную» среду.

Ответы [ 4 ]

3 голосов
/ 27 апреля 2011

Как насчет попытки:
msiexec /i <path to msi> ADDLOCAL=<top level feature name>

Вы можете получить функции высшего уровня, открыв пакет в Orca.exe и просмотрев таблицу возможностей.

2 голосов
/ 03 мая 2011

В конце концов я решил это с помощью командного файла, который сначала запускает msiexec / famus, а если код завершения равен 1605, он запустит msiexec /i.

.
1 голос
/ 28 апреля 2011

Я бы использовал крупные обновления вместо мелких.Для крупного обновления командная строка всегда будет одинаковой - нет необходимости использовать разные командные строки в зависимости от того, будет ли это обновление или новая установка.

На самом деле крупные обновления - это совершенно отдельные установки, связанные с помощью указанной логики.в таблице обновлений, сообщающей установщику Windows, как следует выполнять «обновление».Обновление - это вовсе не обновление, а удаление существующего продукта и установка нового продукта.

Таблица обновлений имеет кривую обучения, иногда она немного гречанна, но позволяетгибкость в определении поведения при обновлении.Некоторые примеры:

  • Вы можете удалить старый продукт и установить новый
  • Вы можете запретить установку более старого продукта поверх нового
  • Youможет позволить понизить более новую версию до запуска более старой (например, чтобы убедиться, что версия, указанная в сценарии входа в систему, соответствует версии на целевых системах)

При крупных обновлениях возникают некоторые дополнительные проблемыэто может запутать вещи.В частности, крупные обновления позволяют установке новой версии предшествовать удалению старой!В этом сценарии требуются безошибочные установки с правильно выполненными ссылками на компонентыОднако наиболее распространенный подход состоит в том, чтобы полностью удалить старую версию, а затем установить новую версию.Этот подход более простителен и, как правило, будет работать правильно, даже если ссылки на компоненты в настройке были испорчены.

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

1 голос
/ 27 апреля 2011

Обычной практикой поддержки незначительных обновлений в одном месте было создание REINSTALL=ALL в пакете, но затем добавление пользовательского действия type 51 (set property) REINSTALL={}, чтобы очистить свойство, когда вашпродукт NOT Installed.Я не уверен, что это именно то, что вы ищете, но это может быть началом.Если вы не создали этот пакет, вы можете добавить как свойство, так и действие clear с помощью преобразования: msiexec.exe /i [...] TRANSFORMS="[...]\reinstall.mst"

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