Что не так с моим пользовательским действием?
Я много раз пытался использовать пользовательское действие, просто чтобы скопировать файл в другое место. Я действительно думаю, что это должно быть легко сработано, но... Я был разочарован тем, что это всегда терпело неудачу!
Я публикую свой код и журнал ошибок, пожалуйста, достаточно любезно, чтобы указать мне выход... Спасибо заранее!!
<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>
И какой-то подход я попробовал:
- Я не думаю, что это связано с существованием quto или file/dir, из журнала, который я скопировал, сгенерированный cmd работает в оболочке cmd, это работает
- Это не связано с 32-битным или 64-битным CA, я пробовал как 32, так и 64-битный. Все тот же провал.
- Я не уверен, связано ли это с привилегиями, но если я пытаюсь отложить 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