我已经尝试了很多次尝试使用自定义操作只是简单地将文件复制到另一个地方。我认为这应该很容易实现,但是......我很沮丧,它总是失败!
我发布了我的代码和错误日志,请任何一个人指出我的出路......提前谢谢!!
<CustomAction Id="QtExecCopyPropertyFileCmd"
Property="QtExec64CmdLine"
Value=""[SystemFolder]cmd.exe" /c copy "C:\Program Files\AptWare\AptWare View\Server\broker\webapps\portal\WEB-INF\classes\portal-links.properties" "C:\ProgramData\AptWare\VDM""/>
<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>
我尝试了一些方法:
最后一个错误日志:
操作 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)
答案 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
执行而不是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
语法,我觉得这可能是你遇到问题的地方。