2013-04-24 41 views
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運行在cmd shell中它的工作原理
  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) 

回答

2

我現在就回答問題。 http://sharp-gamedev.blogspot.com/2009/07/wix-again.html

在上面的鏈接,很顯然,CAQuietExec必須有一些bug,支持構建在DOS命令,如複製,仁,德爾等。然而,使用XCOPY.EXE而不是複製它的工作,我測試,它真正的工作。我認爲ren或del可以找到其他替代品。

對我來說真是個大陷阱!

非常感謝您的回覆!

0

我看到「錯誤」的事情是,你寫了一個自定義操作都沒有。 CopyFile元素支持使用MoveFile表來教MSI該文件需要被複制。這將完全支持回滾,升級和卸載故事。當你將一個dos命令退出進程時,你會失去所有這些。

+0

,因爲它只在安裝過程中發生了,我不能使用的CopyFile。正如我所說的,我需要在實際安裝之前複製這個文件,因爲安裝過程中的正常進程會先卸載以前的版本,然後它會刪除要複製的文件。 – xwei 2013-04-25 01:40:24

1

根據我的理解,您需要將文件從安裝位置複製到另一個位置,然後再卸載以前的升級版本。由於升級將刪除所有已安裝的文件。在這種情況下,請嘗試此代碼。如果您在卸載以前的版本之前安排自定義操作,它將起作用。我嘗試了這個測試項目和它的工作。

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

這是一個好點!謝謝。這將解決「我不使用xcopy」時的「文件不存在問題」。我只是覺得「RemoveFiles」是以前產品的卸載,但沒有注意到有另一個「RemoveExistingProducts」操作。謝謝你,我節省了時間! – xwei 2013-04-25 08:06:16

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

相關問題