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/?