XCOPY для создания указанной директории, если она не существует?

Я использую XCOPY в событии после сборки, чтобы скопировать скомпилированные DLL из их выходных папок в папку вывода основного приложения. Библиотеки DLL копируются в подпапку "Модули" в основной папке вывода приложения, например:

xcopy  "$(TargetPath)" "$(SolutionDir)Prism4Demo.Shell\$(OutDir)Modules\" 

Команда работает нормально, если папка Modules существует, но во время тестирования я обнаружил, что если папка не существует, XCOPY ее не создает, и команда не работает.

Есть ли переключатель XCOPY, который приведет к созданию папки, если она не существует? Если нет, что бы добавить к событию post-build для создания папки, если она не существует? Благодарим за помощь.

Ответ 1

Я попробовал это в командной строке, используя

D:\>xcopy myfile.dat xcopytest\test\

и целевой каталог был правильно создан.

Если вы не можете создать целевой каталог с помощью команды mkdir с cmd расширениями команд, например

cmd /x /c mkdir "$(SolutionDir)Prism4Demo.Shell\$(OutDir)Modules\"

('/x' включает расширения команд, если они не включены по умолчанию в вашей системе, я не знаком с cmd)

использование

cmd /? 
mkdir /?
xcopy /?

для получения дополнительной информации:)

Ответ 2

Ответ на использование "/I" работает, но с небольшим трюком - в цель вы должны заканчиваться символом \, чтобы сообщить xcopy, что цель - это каталог, а не файл!

Пример:

xcopy "$(TargetDir)$(TargetName).dll" "$(SolutionDir)_DropFolder" /F /R /Y /I

не работает и возвращает код 2, но этот:

xcopy "$(TargetDir)$(TargetName).dll" "$(SolutionDir)_DropFolder\" /F /R /Y /I

Аргументы командной строки, используемые в моем примере:

/F - отображает полное имя источника и целевого файла

/R - Это перезапишет файлы только для чтения

/Y - подавляет запрос на перезапись существующего файла (ов)

/I - Предполагается, что назначение - это каталог (но должен заканчиваться на \)

Ответ 3

Я ненавижу шаг PostBuild, он позволяет слишком много вещей, которые могут произойти за пределами инструмента сборки. Я считаю, что лучше позволить MSBuild управлять процессом копирования и выполнять обновление. Вы можете редактировать файл .csproj следующим образом:

  <Target Name="AfterBuild" Inputs="$(TargetPath)\**">
    <Copy SourceFiles="$(TargetPath)\**" DestinationFiles="$(SolutionDir)Prism4Demo.Shell\$(OutDir)Modules\**" OverwriteReadOnlyFiles="true"></Copy>
  </Target>

Ответ 4

Используйте/i с xcopy, и если каталог не существует, он создаст каталог для вас.

Ответ 5

Вы можете использовать robocopy:

robocopy "$(TargetPath)" "$(SolutionDir)Prism4Demo.Shell\$(OutDir)Modules" /E

Ответ 6

Try/E

Чтобы получить полный список опций: xcopy/?