ADDLOCAL=FEATURE1 в MSI установщик удаляет другие ОСОБЕННОСТИ
Я пытаюсь установить один из FEATURE_NEW с помощью установщика wix setup.exe(2.0) поверх setup.exe (1.0)setup.exe / v / qn ADDLOCAL = FEATURE_NEW
Он устанавливает FEATURE_NEW, но проблема в том, что он удаляет другие функции FEATURE1,FEATURE2 и т. Д.
Я хочу обновить существующую функцию и установить новую FEATURE_NEW, дополнительные функции не должны быть установлены.
Поэтому мой вопрос: могу ли я установить / обновить продукт с ранее установленным списком функций "N" плюс недавно добавленная функция, т.е. N + NEW_FEATURES. Я ищу что-то вроде
setup.exe /v /qn ADDLOCAL=INSTALLED_FEATURES,FEATURE_NEW
2 ответа
Раунд 2:
MigrateFeatureStates: я вижу, вы обновили свой вопрос. Похоже, вы имеете дело с функциями. Я полагаю, вы используете серьезное обновление с версии 1 до версии 2? Прежде всего, стандартное действие MSI MigrateFeatureStates
будет пытаться "сохранить" состояние установки компонента для крупных обновлений - если основное обновление настроено для этого в таблице обновлений (столбец атрибутов), просто упомянуть об этом.
Свойства объекта: Другими словами, если вы не установите никаких свойств объекта (ADDLOCAL
, ADDSOURCE
, REMOVE
, ADVERTISE
и т. д.), тогда ваша новая версия должна наследовать структуру компонентов вашей первой версии и автоматически устанавливать все новые функции автоматически (при условии, что они установлены для установки по умолчанию).
MSI API: Исходя из этого, я не уверен, что ваше конкретное добавление функции необходимо, но это может произойти, если ваша функция не установлена для установки по умолчанию. Как уже говорилось, я не знаю, как получить текущее состояние функции через командную строку (может быть одна), но вы можете использовать MSI API, а затем вызвать новую установку через MSI API или командную строку (или некоторые другие). другой путь).
Манипулирование функциями: у меня был устаревший VBScript, который я мог быстро адаптировать для создания msiexec.exe
командные строки для манипулирования состоянием объекта, но перед этим следует упомянуть, что вы можете использовать ряд механизмов в вашем пакете MSI для управления выбором функции: Как установить функцию на основе набора свойств в настраиваемом действии? По сути, вы можете использовать настраиваемое действие для управления выбором объектов по желанию. Вы можете детально осмотреть систему, чтобы определить, какие функции следует устанавливать, а какие нет. Вы также можете использовать условия объекта, чтобы повлиять на выбор объекта без единой строки кода (без специальных действий). Смотрите связанный ответ чуть выше (рекомендуется). В этом ответе также есть раздел "Возможности MSI", который пытается объяснить это: Wix Installer: Настройка свойства условия компонента при выполнении установки MSIEXEC admin из командной строки
Управление функциями графического интерфейса: Я также хочу добавить, что вы, очевидно, можете изменить состояние функции в графическом интерфейсе MSI, если в вашем графическом интерфейсе есть диалоговое окно "Пользовательский", где вы можете увидеть функции, которые должны быть установлены в системе.
Сводка: Итак, в итоге вы можете манипулировать функциями в зависимости от условий и пользовательских действий из вашего MSI - и вы также можете попросить пользователя изменить выбор функции в интерактивном и ручном режиме в графическом интерфейсе. Если этого недостаточно, вы можете получить состояние функции для установленного MSI с помощью MSI API, как показано в VBScript ниже. Сценарий создает фрагмент командной строки, который будет реплицировать состояние установленной функции со всеми добавлениями, которые вы делаете в указанном месте в сценарии. Вам необходимо ввести код продукта для MSI, для которого вы хотите получить состояние функции: Как я могу найти GUID продукта установленной установки MSI? (просто получите его из таблицы свойств вашего MSI или из источника WiX - эта ссылка только для справки). Сценарий по умолчанию получает состояние функции для общего пакета времени выполнения, который может присутствовать на вашем компьютере.
Я предполагаю, что это дает несколько реальных вариантов:
- Положитесь на MigrateFeatureStates для добавления любых новых функций в версии 2. Новые функции должны быть установлены для установки по умолчанию.
- Установите свойства объекта с помощью пользовательского действия или условий объекта.
- Извлеките установленные в настоящий момент состояния функций с помощью MSI API и установите новую версию с помощью msiexec.exe с настраиваемыми свойствами функций, настраиваемыми в командной строке.
- Заставьте пользователя добавлять интерактивные функции, которые ему нужны, в GUI.
- Все, что я забыл.
Этот скрипт легко расширить, чтобы он сообщал обо всех состояниях функций для всех установленных пакетов MSI (что на самом деле и делал скрипт, прежде чем я его адаптировал).
On Error Resume Next
Public cmdline
' Sample Product Codes:
' Microsoft Visual C++ 2008 Redistributable - x86 9.0.30729.17: {9A25302D-30C0-39D9-BD6F-21E6EC160475}
productcode = InputBox("ProductCode for your MSI:", "ProductCode:","{9A25302D-30C0-39D9-BD6F-21E6EC160475}")
If productcode = vbCancel Or Trim(productcode) = "" Then
WScript.Quit(0)
End If
' Arrays of current feature states
ReDim ADDLOCAL(-1), ADDSOURCE(-1), ADVERTISE(-1), REMOVE(-1)
Set installer = CreateObject("WindowsInstaller.Installer")
Set productfeatures = installer.Features(productcode)
If (Err.number <> 0) Then
MsgBox "Failed to open MSI package. Invalid product code?", vbCritical, "Fatal error. Aborting:"
WScript.Quit(2)
End If
' Spin over all product features detecting installation states
For Each feature In productfeatures
featurestate = installer.FeatureState(productcode, feature)
' Using crazy VBScript arrays
Select Case featurestate
Case 1 ReDim Preserve ADVERTISE(UBound(ADVERTISE) + 1) : ADVERTISE(UBound(ADVERTISE)) = feature
Case 2 ReDim Preserve REMOVE(UBound(REMOVE) + 1) : REMOVE(UBound(REMOVE)) = feature
Case 3 ReDim Preserve ADDLOCAL(UBound(ADDLOCAL) + 1) : ADDLOCAL(UBound(ADDLOCAL)) = feature
Case 4 ReDim Preserve ADDSOURCE(UBound(ADDSOURCE) + 1) : ADDSOURCE(UBound(ADDSOURCE)) = feature
Case Else ' Errorstate MsgBox "Error for feature: " + feature
End Select
Next
' Now add whatever feature you need to ADDLOCAL, here is just a sample:
ReDim Preserve ADDLOCAL(UBound(ADDLOCAL) + 1) : ADDLOCAL(UBound(ADDLOCAL)) = "MyNewFeature"
' Flatten arrays
If UBound(ADDLOCAL) > -1 Then cmdline = chr(34) + "ADDLOCAL=" + Join(ADDLOCAL, ",") + chr(34)
If UBound(REMOVE) > -1 Then cmdline = cmdline + + " " + chr(34) + "REMOVE=" + Join(REMOVE, ",") + chr(34)
If UBound(ADVERTISE) > -1 Then cmdline = cmdline + + " " + chr(34) + "ADVERTISE=" + Join(ADVERTISE, ",") + chr(34)
If UBound(ADDSOURCE) > -1 Then cmdline = cmdline + + " " + chr(34) + "ADDSOURCE=" + Join(ADDSOURCE, ",") + chr(34)
' Your current feature installstate translated to msiexec.exe command line parameters
Wscript.Echo cmdline ' MsgBox has 1024 character limit
Раунд 1:
Возможности: Если вы хотите получить состояние установки функции установленного в данный момент продукта (функции выбираются пользователем при установке: Program
, Dictionaries
, SDK
, Help
, Tutorials
и т. д.), тогда это возможно через MSI API. Я не знаком со способом получения состояния установки функции через msiexec.exe
командная строка.
Компоненты: если вы имеете в виду компоненты MSI (атомарные биты установщика, которые назначены для выбираемых пользователем функций, но никогда не видны пользователю напрямую), то я не до конца понимаю, чего вы пытаетесь достичь. ADDLOCAL
является одним из свойств параметров установки компонента, и он влияет только на состояние установки компонента, он только косвенно влияет на компоненты (те, которые назначены для функции, на которую вы ссылаетесь).
Основное обновление: мне интересно, не внедрили ли вы надлежащее серьезное обновление и что это реальная проблема, с которой вы столкнулись. Пожалуйста, обновите ваш вопрос с более подробной информацией. Правильно выполненное серьезное обновление установит все новые компоненты, удалит устаревшие, а также установит все новые функции, которые вы добавили. Прежде чем я напишу больше, пожалуйста, уточните свой вопрос.
У меня есть VBScript, который будет извлекать текущее состояние функции указанного вами продукта (или для всех установленных файлов MSI в этом отношении). Если это действительно то, что вы после.
Если вы делаете ADDLOCAL, то вы явно перечисляете функции, которые вы хотите установить - установленные вами функции - это то, что вы указываете. Он не является инкрементным и не означает "также установить эти функции". Например, он отключает функциональные условия. Если вы хотите добавить функции во время крупного обновления с помощью загрузчика, вы можете использовать MsiEumFeatures(), чтобы получить список установленных функций, в который вы добавляете новые. Другой способ - использовать настраиваемое действие для анализа строки ADDLOCAL, упорядоченной после MigrateFeatureStates, и добавить новую в список.