Раунд 2 :
MigrateFeatureStates : я вижу, вы обновили свой вопрос.Похоже, вы имеете дело с функциями.Я предполагаю, что вы используете значительное обновление с версии 1 до версии 2?Прежде всего, стандартное действие MSI MigrateFeatureStates
попытается «сохранить» состояние установки компонента для основных обновлений - если основное обновление настроено для этого в таблице Upgrade (столбец атрибутов), просто чтобы упомянуть его.
Свойства элемента : Другими словами, если вы не не установите никаких свойств элемента (ADDLOCAL
, ADDSOURCE
, REMOVE
, ADVERTISE
и т. Д.), Затем вашновая версия должна наследовать структуру элементов вашей первой версии и автоматически устанавливать все новые функции автоматически (при условии, что они установлены для установки по умолчанию).
MSI API : Исходя из этого, я не уверен, что ваше конкретное добавление функции необходимо, но возможно, если ваша функция не установлена для установки по умолчанию.Как уже говорилось, я не знаю, как извлечь текущее состояние функции из командной строки (может быть одна), но вы можете использовать MSI API и затем вызывать новую установку через MSI API иликомандная строка (или каким-либо другим способом).
Управление функциями : у меня был устаревший VBScript, который я мог быстро адаптировать для генерации msiexec.exe
командных строк для состояния функцииманипулирование, но прежде чем вдаваться в это, следует упомянуть, что вы можете использовать несколько механизмов в пределах вашего пакета MSI для управления выбором функций: Как установить функцию на основе набора свойств в настраиваемом действии? По сути, вы можете использовать произвольное действие для управления выбором функции по желанию .Вы можете детально осмотреть систему, чтобы определить, какие функции следует устанавливать, а какие нет.Вы также можете использовать условия объекта , чтобы повлиять на выбор объекта без единой строки кода (без пользовательских действий).Смотрите связанный ответ чуть выше (рекомендуется).В этом ответе также есть раздел «Возможности MSI», который пытается объяснить это: Wix Installer: установка свойства условия компонента при установке администратора MSIEXEC из командной строки
Управление функциями графического интерфейса пользователя : Я также хочу добавить, что вы, очевидно, можете изменить состояние функции в графическом интерфейсе MSI, если в вашем графическом интерфейсе есть диалоговое окно «Пользовательский», где вы можете увидеть функции, которые собираются установить наsystem.
Сводка : Таким образом, в итоге вы можете манипулировать функциями с помощью условий элементов и пользовательских действий изнутри вашего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
и т. д.), то естьвозможно через API MSI .Я не знаком со способом получения состояния установки функции через командную строку msiexec.exe
.
Компоненты : Если вы имеете в виду компоненты MSI (атомарные биты установщика, которые назначаются на выбираемые пользователем функции, но никогда не видны пользователю напрямую), тогда я не до конца понимаю, чего вы пытаетесь достичь.ADDLOCAL
является одним из свойств параметров установки компонента , и он влияет только на состояние установки компонента, он только косвенно влияет на компоненты (те, которые назначены для функции, на которую вы ссылаетесь).
Основное обновление : Мне интересно, не осуществили ли вы надлежащее серьезное обновление, и это реальная проблема, с которой вы столкнулись.Пожалуйста, обновите ваш вопрос с более подробной информацией.Правильно выполненное серьезное обновление установит все новые компоненты, удалит устаревшие, а также установит все новые функции, которые вы добавили.Прежде чем я напишу больше, уточните ваш вопрос.
У меня есть VBScript, который будет извлекать текущее состояние функции указанного вами продукта (или для всех установленных файлов MSI в этом отношении).Если это действительно то, что вы после.