Версия установщика Wix 3 нашего продукта успешно выполнила командный файл со следующей конфигурацией:
<SetProperty Id = "RunBatch" Value = ""[SetupDir]batch.bat""
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 = ""[SetupDir]batch.bat""
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)
Позже мы безуспешно попробовали следующие изменения:
exit 0
Мы ожидаем, что вызов командного файла будет работать без ошибок, как это было в Wix 3.
Все это работает на Windows 11.
Есть идеи, что может быть причиной этой ошибки? Большое спасибо!
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>