Пакетный файл CustomAction Wix 5 не работает после обновления с Wix 3

Версия установщика Wix 3 нашего продукта успешно выполнила командный файл со следующей конфигурацией:

<SetProperty Id = "RunBatch" Value = "&quot;[SetupDir]batch.bat&quot;"
    Before = "RunBatch" Sequence = "execute" />
<CustomAction Id = "RunBatch" Execute = "deferred" 
    Return = "check" Impersonate = "no" BinaryKey = "WixCA" DllEntry = "WixQuietExec64" />

<InstallExecuteSequence>
    <Custom Action = "RunBatch" Before = "RunDBSetup" >
        NOT Installed AND NOT REMOVE
    </Custom>
</InstallExecuteSequence>

После преобразования файла wxs в Wix 4 (схема, используемая Wix 5), вышеуказанные элементы были преобразованы в:

<SetProperty Id = "RunBatch" Value = "&quot;[SetupDir]batch.bat&quot;"
    Before = "RunBatch" Sequence = "execute" />
<CustomAction Id = "RunBatch" Execute = "deferred"
    Return = "check" Impersonate = "no" DllEntry = "WixQuietExec" BinaryRef = "Wix4UtilCA_$(sys.BUILDARCHSHORT)" />

<InstallExecuteSequence>
    <Custom Action = "RunBatch" Before = "RunDBSetup" Condition = "NOT Installed AND NOT REMOVE" /></InstallExecuteSequence>

После создания файла wxs мы запускаем msiexec и получаем следующую ошибку для этого специального действия:

MSI (s) (5C:E8) [19:05:48:239]: Executing op: ActionStart(Name=RunBatch,,)
MSI (s) (5C:E8) [19:05:48:242]: Executing op: CustomActionSchedule(Action=RunBatch,ActionType=3073,Source=BinaryData,Target=WixQuietExec,CustomActionData = "C:\Program Files\Company\Product\setup\batch.bat")
MSI (s) (5C:E8) [19:05:48:244]: Creating MSIHANDLE (165) of type 790536 for thread 9192
MSI (s) (5C:3C) [19:05:48:246]: Invoking remote custom action. DLL: C:\WINDOWS\Installer\MSI5719.tmp, Entrypoint: WixQuietExec
MSI (s) (5C!1C) [19:05:48:252]: Creating MSIHANDLE (166) of type 790531 for thread 15644
WixQuietExec:  Error 0x80070002: Command failed to execute.
MSI (s) (5C!1C) [19:05:48:253]: Closing MSIHANDLE (166) of type 790531 for thread 15644
MSI (s) (5C!1C) [19:05:48:253]: Creating MSIHANDLE (167) of type 790531 for thread 15644
WixQuietExec:  Error 0x80070002: QuietExec Failed
MSI (s) (5C!1C) [19:05:48:254]: Closing MSIHANDLE (167) of type 790531 for thread 15644
MSI (s) (5C!1C) [19:05:48:254]: Creating MSIHANDLE (168) of type 790531 for thread 15644
WixQuietExec:  Error 0x80070002: Failed in ExecCommon method
MSI (s) (5C!1C) [19:05:48:255]: Closing MSIHANDLE (168) of type 790531 for thread 15644
CustomAction RunBatch returned actual error code 1603 (note this may not be 100% accurate if translation happened inside sandbox)

Позже мы безуспешно попробовали следующие изменения:

  • Подтверждено, что командный файл запускается без ошибок при вызове непосредственно из строки cmd.
  • Запустите установочный файл с измененной «пустой» версией командного файла, содержащей только оператор echo. Также попробовал завершить командный файл вызовом exit 0
  • Ограничить использование только версий Wix4UtilCA_ для X86 и X64.
  • Установите Impersonate="да"
  • Запуск установщика из PowerShell с правами администратора

Мы ожидаем, что вызов командного файла будет работать без ошибок, как это было в Wix 3.

Все это работает на Windows 11.

Есть идеи, что может быть причиной этой ошибки? Большое спасибо!

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
69
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

tldr: пакетный файл не существует, в результате чего настраиваемое действие возвращает ошибку.

В рамках обновления до Wix 5 мы заменили тепловое преобразование для копирования различных файлов, включая рассматриваемый пакетный файл, на новый элемент «Файлы». На самом деле было два элемента Files, которым изначально было присвоено значение:

       <ComponentGroup Id = "ApplicationFiles">
            <Files Directory = "BinDir" Include = "$(env.HeatProgramSourceFiles)\**">
            </Files>

            <Files Directory = "SetupDir" Include = "$(env.HeatProgramSourceFiles)\**">
            </Files>
        </ComponentGroup>

Обратите внимание, что в приведенной выше конфигурации оба атрибута Include установлены в один и тот же каталог. В результате на несколько файлов, в том числе на пакетный файл.bat, была сделана двойная ссылка. Сборка Wix пропустит копирование файла, если на него ссылаются более одного раза. Это привело к тому, что пакетный файл.bat был скопирован в неправильное место. Когда пользовательское действие попыталось запустить файл в ожидаемом месте, он не существовал. Исправление атрибутов Files Include, чтобы каталоги не перекрывались, исправило пользовательское действие:

       <ComponentGroup Id = "BrainBankFiles">
            <Files Directory = "BinDir" Include = "$(env.HeatProgramSourceFiles)\bin\**">
            </Files>

            <!-- 
                Be careful that the Files Include attribute below specifies a directory that
                DOES NOT overlap any directories specified in previous Files elements.  If
                you do, you will get a warning during the wix build and the duplicate references
                will not get copied to the target location during install.
            -->
            <Files Directory = "SetupDir" Include = "$(env.HeatProgramSourceFiles)\setup\**">
            </Files>
        </ComponentGroup>

Другие вопросы по теме