我的自定义动作出了什么问题?

时间:2013-04-24 14:37:07

标签: wix cmd execution custom-action

我已经尝试了很多次尝试使用自定义操作只是简单地将文件复制到另一个地方。我认为这应该很容易实现,但是......我很沮丧,它总是失败!

我发布了我的代码和错误日志,请任何一个人指出我的出路......提前谢谢!!

   <CustomAction Id="QtExecCopyPropertyFileCmd"
                 Property="QtExec64CmdLine" 
                 Value="&quot;[SystemFolder]cmd.exe&quot; /c copy &quot;C:\Program Files\AptWare\AptWare View\Server\broker\webapps\portal\WEB-INF\classes\portal-links.properties&quot; &quot;C:\ProgramData\AptWare\VDM&quot;"/>
  <CustomAction Id="QtExecCopyPropertyFile"
                BinaryKey="WixCA"
                DllEntry="CAQuietExec64"
                Execute="immidiate"
                Return="check"/>

这是我的行动顺序:

 <InstallExecuteSequence>
     <Custom Action='SetOldPortalLinkFile' After='InstallInitialize'>NOT (Installed OR PORTALLINKFILEEXISTS) AND OLDPORTALLINKFILEEXISTS</Custom>
     <Custom Action='SetPortalLinkFileDestFolder' After='SetOldPortalLinkFile'>NOT (Installed OR PORTALLINKFILEEXISTS) AND OLDPORTALLINKFILEEXISTS</Custom>
     <Custom Action="QtExecCopyPropertyFileCmd" After="SetPortalLinkFileDestFolder">NOT (Installed OR PORTALLINKFILEEXISTS) AND OLDPORTALLINKFILEEXISTS</Custom>
     <Custom Action="QtExecCopyPropertyFile" After="QtExecCopyPropertyFileCmd">NOT (Installed OR PORTALLINKFILEEXISTS) AND OLDPORTALLINKFILEEXISTS</Custom>

我尝试了一些方法:

  1. 我不认为这是由于quto,或者文件/目录存在,从日志中我复制了生成的cmd在cmd shell中运行它可以正常工作
  2. 它与32位或64位CA无关,我尝试了32位和64位。同样的失败。
  3. 我不确定这是否与特权相关,但如果我尝试延迟CA,我仍然会收到错误...在我的场景中我需要立即CA,因为复制的文件将在卸载之前的版本中删除。所以我需要在InstallFinalized
  4. 之前运行它

    最后一个错误日志:

    操作 6:22:34: QtExecCopyPropertyFileCmd。
    
    操作开始 6:22:34: QtExecCopyPropertyFileCmd。
    
    MSI (s) (90:88) [06:22:34:743]: Transforming table CustomAction.
    
    MSI (s) (90:88) [06:22:34:743]: PROPERTY CHANGE: Adding QtExec64CmdLine property. Its value is '"C:\Windows\SysWOW64\cmd.exe" /c copy "C:\Program Files\AptWare\AptWare View\Server\broker\webapps\portal\WEB-INF\classes\portal-links.properties" "C:\ProgramData\AptWare\VDM"'.
    
    操作结束 6:22:34: QtExecCopyPropertyFileCmd。返回值 1。
    
    MSI (s) (90:88) [06:22:34:743]: Doing action: QtExecCopyPropertyFile
    
    操作 6:22:34: QtExecCopyPropertyFile。
    
    操作开始 6:22:34: QtExecCopyPropertyFile。
    
    MSI (s) (90:88) [06:22:34:746]: Transforming table CustomAction.
    
    MSI (s) (90:98) [06:22:34:748]: Invoking remote custom action. DLL: C:\Windows\Installer\MSIB138.tmp, Entrypoint: CAQuietExec64
    
    MSI (s) (90:2C) [06:22:34:762]: PROPERTY CHANGE: Deleting QtExec64CmdLine property. Its current value is '"C:\Windows\SysWOW64\cmd.exe" /c copy "C:\Program Files\AptWare\AptWare View\Server\broker\webapps\portal\WEB-INF\classes\portal-links.properties" "C:\ProgramData\AptWare\VDM"'.
    
    CAQuietExec64:  Error 0x80070001: Command line returned an error.
    
    CAQuietExec64:  Error 0x80070001: CAQuietExec64 Failed
    
    CustomAction QtExecCopyPropertyFile returned actual error code 1603 (note this may not be 100% accurate if translation happened inside sandbox)
    

4 个答案:

答案 0 :(得分:2)

我现在回答。 http://sharp-gamedev.blogspot.com/2009/07/wix-again.html

在上面的链接中,很明显,CAQuietExec必须有一些bug才能支持build命令的构建,例如copy,ren,del等。但是,使用xcopy.exe而不是复制它工作,我测试过,它确实有效。我认为ren或del也可以找到其他替换。

对我来说真是个大陷阱!!

谢谢所有亲切的回复!

答案 1 :(得分:1)

根据我的理解,您需要先将文件从安装位置复制到另一个位置,然后再卸载升级中的先前版本。由于升级将删除已安装的所有文件。在这种情况下,请尝试此代码。如果您在卸载以前的版本之前安排自定义操作,它将起作用。我尝试了测试项目及其对我的工作。

<RemoveExistingProducts Before="InstallInitialize" />
<Custom Action="QtExecCopyPropertyFileCmd" After="AppSearch"> (NOT Installed)</Custom>
<Custom Action="QtExecCopyPropertyFile" After="QtExecCopyPropertyFileCmd"> (NOT Installed)</Custom>

答案 2 :(得分:0)

我看到“错误”的是你根本就写了一个自定义动作。 CopyFile元素支持使用MoveFile表来教MSI需要复制此文件。这将完全支持回滚,升级和卸载故事。当你将进程外壳发送到dos命令时,你将失去所有这些。

答案 3 :(得分:0)

好像你已经找到了解决方案。

但我正在使用copy几乎与您一样,我认为可能值得为任何想要使用copy代替xcopy的人分享我的解决方案。我从你的链接尝试了xcopy解决方案,但对我来说,xcopy更适合批量复制,另一方面,我正在复制单个文件,我也想要定义我自己的destinate文件名,但是使用xcopy与CA(如果可能的话)。

对于我的项目,我使用deferred执行而不是immediateimmediate也可以,但语法会有所不同:

<!--Syntex for deferred-->
    <!--<Property Id='QtExecCA' Value='"cmd.exe" /c copy C:\temp\test.txt C:\temp\test2.txt' />-->
    <!--Syntex for immediate-->
    <Property Id='QtExecCmdLine' Value='"cmd.exe" /c copy C:\temp\test.txt C:\temp\test2.txt' /><CustomAction Id='QtExecTest' BinaryKey='WixCA' DllEntry='CAQuietExec'
              Execute='immediate' Return='check'/>
.
.
.
<InstallExecuteSequence>
  <Custom Action='QtExecCA' After='InstallInitialize'/>
</InstallExecuteSequence>

这是我的复制代码。

我尝试了QtExec语法,我觉得这可能是你遇到问题的地方。

Reference for QtExec