2016-12-20 2 views
0

Я создаю установщик с помощью набора инструментов WiX. Я хотел бы создать резервную копию старой конфигурации (файлы с расширением .config), когда флажок установлен, а затем установите новые с помощью _new, добавленного к имени.Cmd не работает как пользовательское действие установщика

Я создал сценарии cmd для этого и ввел их в пользовательские действия.

<CustomAction Id="RenameNewConfigs" Directory="INSTALLFOLDER" ExeCommand='for /r %%a in (*.config) do ren "%%~a" "%%~na_new%%~xa"' Impersonate="no" Execute="deferred" Return="ignore" /> 
<CustomAction Id="MoveOldConfigs" Directory="INSTALLFOLDER" ExeCommand='xcopy /SYI "..\OldConfigs" "."' Impersonate="no" Execute="deferred" Return="ignore" /> 
<CustomAction Id="RemoveConfigsBackup" Directory="INSTALLFOLDER" ExeCommand='rd ..\OldConfigs /S /Q' Impersonate="no" Execute="deferred" Return="ignore" /> 
<InstallExecuteSequence> 
    <Custom Action="RenameNewConfigs" After="InstallFiles">KEEP_OLD_CONFIGURATION</Custom> 
    <Custom Action="MoveOldConfigs" After="RenameNewConfigs">KEEP_OLD_CONFIGURATION</Custom> 
    <Custom Action="RemoveConfigsBackup" After="MoveOldConfigs">INSTALLED AND (NOT REMOVE="ALL")</Custom> 
</InstallExecuteSequence> 

Во время исполнения (в соответствии с бревнами) первая и третья команды производят следующий вывод:

Info 1721. There is a problem with this Windows Installer package. A program required for this install to complete could not be run. Contact your support personnel or package vendor. Action: RenameNewConfigs, location: C:\Program Files\correct\path\, command: for /r %%a in (*.config) do ren "%%~a" "%%~na_new%%~xa" 

Что не так? Почему не удается выполнить стандартную команду?

ответ

1

Существует важное различие между тем, что может быть выполнено в командной строке, и тем, что на самом деле является командой. В этом случае for и rd встроены, и только xcopy - это собственная команда. Чтобы определить это, вы можете запустить where for, where xcopy и where rd в командной строке. Кроме того, установщику Windows часто требуется указать полный путь к команде. Это может быть как-то вроде [SystemFolder]xcopy.exe, но невозможно для встроенного. Вместо этого вам нужно будет указать что-то вроде [SystemFolder]cmd.exe /c rd ...

Обратите внимание, что это не лучший способ выполнить то, что вы хотите выполнить. Не только подсказки команд, появляющиеся во время установки, выглядят плохо, но они не очень хорошо интегрируются с протоколированием, отчетами об ошибках или откатом. Если возможно, вам лучше использовать настоящие функции установщика Windows (например, через таблицы и RemoveFile), поскольку они предназначены для обработки сценариев отката. Если нет, вы можете, по крайней мере, получить гораздо лучшую интеграцию, если напишите C++ custom action dll и используйте его вместо exes.

+0

+1 настоятельно рекомендую использовать встроенную функциональность WiX для выполнения той же задачи и с помощью C++/C# (Если вы знаете, .NET присутствует всегда) в противном случае. –

0

Вам необходимо выполнить свою команду в исполняемом приложении, в вашем случае это будет cmd.exe.

ExeCommand='cmd.exe /c &quot;for %a in (*.config) do ren "%~a" "%~na_new%~xa"&quot;"' 

Изменить код в это, и он должен работать :)

Смежные вопросы