Вызов robocopy из ошибок пользовательской настройки wix

У меня есть пользовательское действие wix

<CustomAction Id="BaselineSync_Cmd" Property="BaselineSync" Execute="immediate"
    Value="&quot;robocopy&quot; &quot;[SI_BUP]&quot; &quot;[SI_PROD]&quot; /PURGE" />
<CustomAction Id="BaselineSync" BinaryKey="WixCA" DllEntry="CAQuietExec" Execute="deferred" Return="ignore" Impersonate="no"/>
<CustomAction Id="RoboCopy_Cmd" Property="RoboCopy" Execute="immediate"
    Value="&quot;robocopy&quot; &quot;[INSDIR]&quot; [SI_PROD]" />
<CustomAction Id="RoboCopy" BinaryKey="WixCA" DllEntry="CAQuietExec" Execute="deferred" Return="ignore" Impersonate="no"/>

У меня работает более ранняя команда robocopy, но не вторая. При установке я передаю значения SI_BUP, INSDIR и SI_PROD через командную строку. Примерно так: INSDIR=C:\testing\CONTENT SI_BUP=C:\testing\BACKUP SI_PROD=C:\testing\PROD /qn /l*v install.log

Журнал первого пользовательского действия:

MSI (s) (74:88) [15:00:52:118]: Executing op: CustomActionSchedule(Action=BaselineSync,ActionType=3137,Source=BinaryData,Target=CAQuietExec,CustomActionData="robocopy" "C:\testing\BACKUP" "C:\testing\PROD" /PURGE /e)

CAQuietExec:  -------------------------------------------------------------------------------
CAQuietExec:     ROBOCOPY     ::     Robust File Copy for Windows                              
CAQuietExec:  -------------------------------------------------------------------------------
CAQuietExec:  
CAQuietExec:    Started : Thu Jun 19 15:00:52 2014
CAQuietExec:  
CAQuietExec:     Source : C:\testing\BACKUP\
CAQuietExec:       Dest : C:\testing\PROD\

Лог второго пользовательского действия:

MSI (s) (74:88) [15:00:52:190]: Executing op: CustomActionSchedule(Action=RoboCopy,ActionType=3137,Source=BinaryData,Target=CAQuietExec,CustomActionData="robocopy" "C:\testing\CONTENT\" "C:\testing\PROD" /e)

CAQuietExec:  
CAQuietExec:  -------------------------------------------------------------------------------
CAQuietExec:     ROBOCOPY     ::     Robust File Copy for Windows                              
CAQuietExec:  -------------------------------------------------------------------------------
CAQuietExec:  
CAQuietExec:    Started : Thu Jun 19 15:00:52 2014
CAQuietExec:  
CAQuietExec:     Source : C:\testing\CONTENT" C:\testing\PROD \e\
CAQuietExec:       Dest - 

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


person Sourav Kundu    schedule 19.06.2014    source источник


Ответы (2)


В переменной [INSDIR] есть завершающая обратная косая черта, о чем свидетельствует эта часть журнала на втором ЦС:

"robocopy" "C:\testing\CONTENT\" "C:\testing\PROD"

Вместо C:\testing\CONTENT\ нужно C:\Testing\CONTENT. По сути, это синтаксическая ошибка Robocopy.

person Snixtor    schedule 20.06.2014
comment
Спасибо Сникстор. Это то, что robocopy показывает через журнал, однако, когда я передаю значения через командную строку, у меня нет такой обратной косой черты. - person Sourav Kundu; 20.06.2014

<CustomAction Id="BaselineSync_Cmd" Property="BaselineSync" Execute="immediate" 
    Value="&quot;robocopy&quot; &quot;[SI_BUP]&quot; &quot;[SI_PROD]&quot; /PURGE /e" />
<CustomAction Id="BaselineSync" BinaryKey="WixCA" DllEntry="CAQuietExec" Execute="deferred" Return="ignore" Impersonate="no"/>
<CustomAction Id="RoboCopy_Cmd" Property="RoboCopy" Execute="immediate"
    Value="&quot;robocopy&quot; &quot;[INSDIR]$(var.AppName)&quot; &quot;[SI_PROD]&quot; /e" />
<CustomAction Id="RoboCopy" BinaryKey="WixCA" DllEntry="CAQuietExec" Execute="deferred" Return="ignore" Impersonate="no"/>

Небольшое изменение второго пользовательского действия, как показано выше, — RoboCopy_Cmd, где я добавил $(var.AppName), который установлен в файле msbuild, из которого вызывается это пользовательское действие, и небольшое изменение аргумента командной строки дало желаемый результат.

Теперь командная строка выглядит так:

INSDIR=C:\testing\CONTENT SI_BUP=C:\testing\MyProd SI_PROD=C:\testing\PROD\MyProd

В файле msbuild AppName задается как:

<AppName>MyProd</AppName>

INSDIR — это место, где установлен продукт. Итак, содержимое установлено на C:\testing\CONTENT\MyProd

person Sourav Kundu    schedule 17.09.2014