1

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

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

   <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 shell 中运行的生成的 cmd 它可以工作
  2. 它与 32 位或 64 位 CA 无关,我尝试了 32 位和 64 位。都是同样的失败。
  3. 我不确定这是否与特权有关,但如果我尝试延迟 CA,仍然出现错误......在我的场景中,我需要一个立即的 CA,因为在卸载以前的版本期间复制的文件将被删除。所以我需要它在 InstallFinalized 之前运行

最后,错误日志:

操作 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

4 回答 4

2

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

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

对我来说是多么大的陷阱!!

谢谢大家热心回复!

于 2013-04-25T08:07:07.387 回答
1

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

<RemoveExistingProducts Before="InstallInitialize" />
<Custom Action="QtExecCopyPropertyFileCmd" After="AppSearch"> (NOT Installed)</Custom>
<Custom Action="QtExecCopyPropertyFile" After="QtExecCopyPropertyFileCmd"> (NOT Installed)</Custom>
于 2013-04-25T07:04:08.577 回答
0

我看到的“错误”是您完全编写了自定义操作。CopyFile 元素支持使用 MoveFile 表来告知 MSI 该文件需要被复制。这将完全支持回滚、升级和卸载故事。当您将进程退出到 dos 命令时,您将失去所有这些。

于 2013-04-24T18:45:13.850 回答
0

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

但我copy几乎和你一样使用,我认为值得分享我的解决方案给任何想要使用copy而不是xcopy. 我确实从您的链接中尝试过 xcopy 解决方案,但对我来说,xcopy 更适合批量复制,另一方面,我正在复制单个文件,我也想定义自己的目标文件名,但使用 xcopy 与CA(如果可能)。

对于我的项目,我使用deferredExecute 而不是immediate,immediate也是可能的,但语法会有所不同:

<!--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语法正确,我认为这可能是您遇到问题的地方。

参考QtExec

于 2014-03-07T01:43:00.693 回答