Я создаю установщик MSI с помощью WiX, и у меня есть, скажем, файл * .bat, который Я копирую в SomeFolder2 под %temp%
(что-то вроде фрагмента кода ниже ...)
...
<Directory Id='TARGETDIR' Name='SourceDir'>
<Directory Id='ProgramFilesFolder' Name='PFiles'>
<Directory Id='MyDir' Name='SomeFolder'>
<!-- %TEMP -->
<Directory Id="TempFolder" Name="TmpFolder">
<Directory Id='MyDir2' Name='SomeFolder2'>
<!-- CREATE THE %TEMP%\SomeFolder2 FOLDER -->
<Component Id='FolderComponent' Guid='{GUID}'>
<CreateFolder />
</Component>
<Component Id='CheckComponent' Guid='{GUID}'>
<File Id='mybat' Name='mybat.bat' DiskId='1' Source='.\mybat.bat' KeyPath="yes">
<Shortcut Id="mybatShcut"
Directory="ProgramMenuDir"
Name="{name}"
WorkingDirectory='INSTALLDIR'
Advertise="yes" />
</File>
</Component>
</Directory>
</Directory>
</Directory>
</Directory>
</Directory>
...
Теперь, чтобы запустить это, у меня есть два настраиваемых действия (DESTDIR
это %TEMP%\SomeFolder2
):
<CustomAction Id="SetPath" Property="ThePath" Value="[DESTDIR]\mybat.bat" />
<CustomAction Id="StartAction" Property="ThePath" ExeCommand="" Return="asyncNoWait" />
Затем в последовательности установки:
<InstallExecuteSequence>
<Custom Action="SetPath" After="{some standard MS action}">NOT REMOVE="ALL"</Custom>
<Custom Action="StartAction" Before="{some other action}">NOT REMOVE="ALL"</Custom>
...
</InstallExecuteSequence>
Я заставил SetPath запускаться после множества стандартных действий (например, PublishProduct), в то время как StartAction будет выполняться перед другим настраиваемым действием.
Когда я запускаю файл MSI, я смотрю в журнал, и ThePath устанавливает правильный путь. Однако при запуске StartAction я получаю эту ошибку:
Возвращаемое значение 1631.
которые, согласно документации, переводятся как «ERROR_CREATE_FAILED» (не удалось запустить службу установщика Windows. Обратитесь в службу поддержки). Дело в том, что файл действительно был скопирован в %TEMP%\SomeFolder2
(до установки пути и фактического выполнения, могу я добавить ...), но по какой-то причине он вообще не выполняется (если вы выполняете его вручную или через командную строку или еще что-то, он выполняется нормально).
Я пробовал поместить этот же файл в ProgramFiles\Some_Directory_For_The_Program
. Происходит то же самое; он копируется туда, но не выполняется. Почему это происходит?