Переключатель XCOPY для создания указанного каталога, если он не существует? - PullRequest
70 голосов
/ 03 марта 2011

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

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

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

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

Ответы [ 8 ]

106 голосов
/ 27 марта 2012

Ответ на использование "/ I" работает, но с небольшим фокусом - в target вы должны заканчиваться символом \, чтобы сообщить 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 - Предполагается, что местом назначения является каталог (но должно заканчиваться на \)

46 голосов
/ 03 марта 2011

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

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

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

Если нет, вы можете создать целевой каталог, используя команду mkdir с *Расширения команд 1007 * включены как

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

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

используйте

cmd /? 
mkdir /?
xcopy /?

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

15 голосов
/ 03 марта 2011

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

  <Target Name="AfterBuild" Inputs="$(TargetPath)\**">
    <Copy SourceFiles="$(TargetPath)\**" DestinationFiles="$(SolutionDir)Prism4Demo.Shell\$(OutDir)Modules\**" OverwriteReadOnlyFiles="true"></Copy>
  </Target>
14 голосов
/ 07 мая 2011

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

6 голосов
/ 03 марта 2011

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

robocopy "$(TargetPath)" "$(SolutionDir)Prism4Demo.Shell\$(OutDir)Modules" /E
1 голос
/ 30 марта 2018

Я попробовал это на command.it работает для меня.

if "$(OutDir)"=="bin\Debug\"  goto Visual
:TFSBuild
goto exit
:Visual
xcopy /y "$(TargetPath)$(TargetName).dll" "$(ProjectDir)..\Demo"
xcopy /y "$(TargetDir)$(TargetName).pdb" "$(ProjectDir)..\Demo"
goto exit
:exit
0 голосов
/ 08 марта 2019

Простой короткий ответ таков:

xcopy /Y /I "$(SolutionDir)<my-src-path>" "$(SolutionDir)<my-dst-path>\"
0 голосов
/ 03 марта 2011

Попробуйте / E

Чтобы получить полный список параметров: xcopy /?

...