使用自定义操作在WiX中运行复制的文件

时间:2010-10-27 08:51:48

标签: installer wix windows-installer wix3

我正在使用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下。同样的事情发生了;它被复制到那里,但它不会执行。为什么会这样?

1 个答案:

答案 0 :(得分:4)

首先,只要您想在自定义操作中使用程序包安装的文件,就应该将其设为deferred。也就是说,您的示例中的StartAction CA必须延迟。此外,当我需要从CA运行可执行文件时,我尝试使用QtExec standard CA

我希望这会有所帮助。