Короткая версия
Множество экземпляров : Я думаю, что многие версии вашего пакета установлены во многих случаях "поверх друг друга" - некоторые из которых скрыты от Add / Remove Programs
из-за параметр ARPSYSTEMCOMPONENT=1
указывается в (некоторых) пакетах. Один из установленных экземпляров имеет тот же код продукта, что и пакет, который вы пытаетесь установить - это активирует режим обслуживания, поскольку код продукта уже зарегистрирован как установленный.
Путаница с кодом пакета? : также возможно, что вы установили две или более версии одного и того же MSI с идентичными кодами пакета ( в отличие от кодов продуктов ). Это всегда вызывает загадочные проблемы - например, проблема, с которой вы сталкиваетесь в режиме обслуживания (идентичные идентификаторы GUID означают, что два разных файла MSI по определению будут рассматриваться как один и тот же файл - поскольку идентификаторы GUID одинаковы) X-Files следует как msiexec.exe
идет за вашей спиной и запускается из старого, кэшированного MSI, а не вашего нового MSI).
Bundle? : Как пишет Фил, это также может быть проблемой связки WiX. Возможно, сначала попробуйте выполнить сценарий внизу, чтобы получить полный список того, что установлено - скрыто или нет.
Подробная версия
Возможная причина : Кажется, вы устанавливаете ARPSYSTEMCOMPONENT = 1
, который скрывает настройку из «Установка и удаление программ» ( ARP ). Насколько я вижу, в журнале есть множество кодов упаковки и продукта, которые не совпадают с теми, которые вы указали в своем вопросе. Кажется, в системе может быть установлено несколько более старых тестовых версий, которые также могут быть скрыты от ARP, но все еще установлены на коробке . Не знаете, почему вы говорите, что текущая версия отображается в ARP? С установленным ARPSYSTEMCOMPONENT он не должен этого делать.
Виртуалы : как всегда гласит девиз: тестируйте виртуальные машины, когда вы видите странные проблемы - чтобы определить, есть ли у вас грязная тестовая среда. Тестирование виртуальных компьютеров крайне важно для меня, но я часто делаю это слишком поздно.
MSDN: ARPSYSTEMCOMPONENT .
UPDATE
Механизм Culprit : если вы установите автоматический код продукта, каждая сборка сможет быть установлена без отображения режима обслуживания - даже без создания таблицы обновления вообще , Когда вы комбинируете это с сокрытием от «Установка и удаление программ», вы внезапно не можете сказать, какие предыдущие версии были установлены. Дубликаты, установленные поверх друг друга, могут накапливаться при выполнении тестовых установок.
Поскольку кажется, что вы автоматически генерируете код продукта, у вас никогда не должно быть текущей проблемы: режим обслуживания. Это заставляет меня заподозрить проблему с дублированием кода пакета . Или проблема связки, как предложил Фил. У меня слишком мало опыта работы со связками. Может ли это быть ошибкой связки? Или даже ошибка WiX?
Удаление вручную : Возможно, попробуйте использовать VBScript, который вы можете найти здесь, для экспорта списка кодов продуктов MSI, которые в настоящее время установлены в системе (независимо от того, скрыты они или нет): Как найти GUID продукта установленной установки MSI? (внизу, под " Альтернативные инструменты, раздел 3 * 1082" * ".
ОБНОВЛЕНИЕ : см. Ниже встроенную и измененную версию скрипта .
Получив список, попробуйте удалить нежелательные тестовые пакеты, используя:
msiexec.exe /x [ProductCode]
продолжайте удаление, пока у вас не появится "чистый ящик".
Основное обновление с распространением полной версии : В качестве альтернативы, вы можете установить широкий диапазон версий (минимальная / максимальная версия) для таблицы обновлений, чтобы увидеть, можно ли удалить все существующие версиис регулярным крупным обновлением.Честно говоря, я никогда не тратил время на тестирование удаления нескольких предыдущих версий с помощью значительных обновлений, но, насколько я знаю, это должно работать. NB !: Я не думаю, что это будет работать, если у вас есть дублирование кода пакета .
Удаление связанных продуктов : еще один ответ, показывающий, какудалить все продукты, использующие один и тот же код обновления.Обратите внимание на заявление об отказе от ответственности за автоматическую перезагрузку при запуске в режиме без вывода сообщений: Powershell: удаление приложения с помощью UpgradeCode .
Удаление по названию продукта : И менее разумно, но я просто добавлю ссылку на ответственное хранение.Вот как можно удалить пакет MSI по имени продукта: Есть ли альтернатива GUID при использовании msiexec для удаления приложения?
Список всех установленных продуктов MSI
ОБНОВЛЕНИЕ : Если подумать, позвольте мне добавить приведенный выше скрипт с несколькими дополнениями - это добавляет заголовки, код издателя и кода пакета к экспорту. Этот скрипт должен показывать все установленные пакеты, в том числе скрытые из программы «Установка и удаление программ» (если вам также нужен код обновления, то по техническим причинам это немного сложнее, здесь приведено описание того, какэто может быть сделано неуклюже - эта ссылка в свою очередь имеет дополнительные ссылки для получения кодов обновления с помощью Powershell):
' Retrieve all ProductCodes (with ProductName and ProductVersion)
Set fso = CreateObject("Scripting.FileSystemObject")
Set output = fso.CreateTextFile("msiinfo.csv", True, True)
Set installer = CreateObject("WindowsInstaller.Installer")
output.writeline ("Product Code,Product Name,Product Version,Package Code, Publisher")
On Error Resume Next ' we ignore all errors
For Each product In installer.ProductsEx("", "", 7)
productcode = product.ProductCode
name = product.InstallProperty("ProductName")
version=product.InstallProperty("VersionString")
packagecode=product.InstallProperty("PackageCode")
publisher=product.InstallProperty("Publisher")
output.writeline (productcode & ", " & name & ", " & version & ", " & packagecode & ", " & publisher)
Next
output.Close
Использование :
- Скопируйте скрипт и вставьте его в файл * .vbs на рабочем столе и попробуйте запустить его двойным щелчком мыши.Ваш рабочий стол должен быть доступен для записи, или вы можете использовать любое другое доступное для записи место.
- Выходной файл создается в папке, из которой вы запускаете скрипт (папка должна быть доступной для записи).Выходной файл называется
msiinfo.csv
. - Дважды щелкните файл, чтобы открыть его в приложении для работы с электронными таблицами, выберите запятую в качестве разделителя при импорте - ИЛИ - просто откройте файл в Блокноте или любом средстве просмотра текста.
- Содержимое в электронной таблице должно быть отформатировано в столбцах, если не открыть файл вручную и импортировать файл, выбрав запятую в качестве разделителя для файла CSV (значения, разделенные запятыми).Это обеспечит полные возможности работы с электронными таблицами, такие как сортировка по столбцам, например, Publisher, и вы увидите все настройки рядом друг с другом.