Если рассматривать эту часть проекта , как отдельную утилиту формирования NSIS кода для MSI установки, то происходить будет следующее :
Но сначала ещё немного лирики.

На кой нам получать ещё и
ProductName ? А на той, чтобы видеть над прогрессом установки не бестолковое мельтешение устанавливаемых файлов (или отсутствие оного), что обычно и наблюдаем по умолчанию, а видеть то, что конретно в данный момент устанавливается. Полученный ProductName и будем использовать в DetailPrint "Installing....
Следующий момент. Если с установкой одного msi пакета всё более-менее ясно, то как быть когда их придётся устанавливать несколько ?
Вот конкретный пример, когда я пересобирал отдельное приложение из гигантского пакета Adobe Creative Suite CS5 , для которого пришлось устанавливать аж 8 разных msi пакетов ! (Хотя по сути это были, расчленённые на отдельные дистрибутивы, составляющие их разных VC++... Но разрабам же виднее...)
Как быть с такими случаями в нашем случае ? Я бы предусмотрел в скрипте выбор для разных вариаций msi пакетов.
Например, для начала пусть присутствуют 9 чекбоксов для выбора. Тут есть нюансы, но про это позже...
Пакеты эти, надо предварительно подготовить, создав (для моего примера) 8 папок с именами 1...8, и в каждую из которых, поместить нужные msi дистпибутивы.
Т.е. , что получается :
Запускаем скомпилированный скрипт.
Отмечаем нужные для установки msi пакеты (msi1...msi8)
Отмеченные папки 1...8 с содержимым копируются в $TEMP. В каждую папку копируется файл vbs скрипта (чтобы не было путаницы).
Vbs скрипт начинает свою работу, создав в каждой папке ProductCode.txt и ProductName.txt.
Данные из ProductCode.txt и ProductName.txt заносятся в соответствующие
переменные и записываются в код
нового созданного файла msi.nsi. Где он будет создан, не критично. К примеру, в C:/myMSInsi
В этот файл msi.nsi записывается (пример на основе кода из справочника, наверное можно и иначе) :
Код:

!define MSIGETPRODUCTINFO '!insertmacro MsiGetProductInfo'
Var MSI_PRODUCT
!macro MsiGetProductInfo PRODUCTCODE PROPERTY
и т.д.
Section 1
SetOverwrite on
${MSIGETPRODUCTINFO} "{переменная для кода продукта 1 msi пакета)}" "ProductName"
и т.д.
SectionEnd
Сколько выбрано MSI пакетов для установки - столько запишется и секций.
Ну и в конце "подчищаем" за собой, удаляя не нужное.
Готовый код из файла msi.nsi используем для дальнейшей работы.
Моё сочинение наверняка спорно, потому прошу принять участие в "доводке" и совершенствовании...