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、またはファイル/ディレクトリの存在によるものではないと思います。
  2. 32bit CA や 64bit CA とは関係ありませんが、32bit と 64bit 両方試してみました。すべて同じ失敗。
  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 には、copy、ren、del などの dos コマンドの組み込みをサポートするためのバグがいくつかあるはずです。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 要素は、このファイルをコピーする必要があることを MSI に教えるために、MoveFile テーブルの使用をサポートします。これにより、ロールバック、アップグレード、およびアンインストールのストーリーが完全にサポートされます。アウトプロセスで dos コマンドにシェルを実行すると、そのすべてが失われます。

于 2013-04-24T18:45:13.850 に答える