Что не так с моим пользовательским действием?

Я много раз пытался использовать пользовательское действие, просто чтобы скопировать файл в другое место. Я действительно думаю, что это должно быть легко сработано, но... Я был разочарован тем, что это всегда терпело неудачу!

Я публикую свой код и журнал ошибок, пожалуйста, достаточно любезно, чтобы указать мне выход... Спасибо заранее!!

   <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 или file/dir, из журнала, который я скопировал, сгенерированный cmd работает в оболочке 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 ответа

Решение

Я иду ответ сейчас. http://sharp-gamedev.blogspot.com/2009/07/wix-again.html

Очевидно, что в приведенной выше ссылке CAQuietExec должен иметь некоторые ошибки для поддержки встроенных команд dos, таких как copy, ren, del и т. Д. Однако, вместо того, чтобы скопировать его, используйте xcopy.exe, я тестировал, он действительно работает. Я думаю, что Ren или Del может найти другие замены, а также.

Какая большая ловушка для меня!

Спасибо всем любезно ответил!

Насколько я понимаю, вам нужно скопировать файл из вашего места установки в другое место, прежде чем удалить предыдущую версию в обновлении. Так как обновление удалит все файлы, которые уже установлены. В этом случае попробуйте этот код. Если вы запланировали действие Custom перед удалением предыдущей версии, оно будет работать. Я попробовал это с тестовым проектом и его работой для меня.

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

То, что я вижу "неправильно", это то, что вы написали пользовательское действие вообще. Элемент CopyFile поддерживает использование таблицы MoveFile, чтобы указать MSI, что этот файл необходимо скопировать. Это тогда полностью поддержит откат, обновление и удаление историй. Вы теряете все это, когда выходите из процесса командой dos.

Похоже, вы уже нашли свое решение.

Но я пользуюсь copy почти так же, как вы, я думаю, что стоит поделиться своим решением для тех, кто хочет использовать copy вместо xcopy, Я пробовал решение xcopy по вашей ссылке, но для меня xcopy больше подходит для пакетного копирования, с другой стороны, я копирую один файл, и я также хочу определить свое собственное имя файла назначения, но использовать 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 синтаксис правильный, и я думаю, что это может быть там, где у вас есть проблемы.

Ссылка дляQtExec

Другие вопросы по тегам