我正在使用WiX创建一个MSI安装程序,我有一个* .bat文件,我正在%temp%
下复制到SomeFolder2(类似下面的代码片段... )
...
<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>
我已经在各种标准操作(例如,PublishProduct)之后运行SetPath,而StartAction将在另一个自定义操作之前运行。
当我运行MSI文件时,我查看日志,并且确实使用正确的路径设置了ThePath。但是,运行StartAction时,我收到此错误:
返回值1631。
根据文档,转换为“ERROR_CREATE_FAILED”(Windows Installer服务无法启动。请联系您的支持人员)。问题是,文件确实被复制到%TEMP%\SomeFolder2
(在设置路径和实际执行之前,我可以添加...),但由于某种原因,它根本不执行(如果你手动或通过命令提示符执行它,或者诸如此类,它确实正常执行)。
我尝试将相同的文件放在ProgramFiles\Some_Directory_For_The_Program
下。同样的事情发生了;它被复制到那里,但它不会执行。为什么会这样?
答案 0 :(得分:4)
首先,只要您想在自定义操作中使用程序包安装的文件,就应该将其设为deferred。也就是说,您的示例中的StartAction CA必须延迟。此外,当我需要从CA运行可执行文件时,我尝试使用QtExec standard CA。
我希望这会有所帮助。