如果不存在,XCOPY切换到创建指定的目录?

时间:2011-03-03 02:00:19

标签: xcopy post-build-event

我在后期构建事件中使用XCOPY将已编译的DLL从其输出文件夹复制到主应用程序的输出文件夹。 DLL正被复制到主app输出文件夹中的“Modules”子文件夹,如下所示:

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

如果Modules文件夹存在,该命令工作正常,但我在测试期间发现如果文件夹不存在,XCOPY不会创建它,并且命令失败。

是否存在XCOPY开关,如果该文件夹不存在,将导致该文件夹被创建?如果没有,如果它不存在,我将添加到我的post-build事件中以创建该文件夹?谢谢你的帮助。

9 个答案:

答案 0 :(得分:106)

使用“/ 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 - 假设目的地是目录(但必须以\结尾)

答案 1 :(得分:46)

我在命令行上使用

尝试了这个
D:\>xcopy myfile.dat xcopytest\test\

并正确创建了目标目录。

如果没有,您可以使用mkdir命令创建目标目录,并启用cmd的命令扩展名,如

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

('/ x'启用命令扩展,以防系统默认情况下未启用它们,我不熟悉cmd

使用

cmd /? 
mkdir /?
xcopy /?

了解更多信息:)

答案 2 :(得分:15)

我讨厌PostBuild步骤,它允许在构建工具的权限范围之外发生太多事情。我相信让MSBuild管理复制过程并进行更新会更好。您可以像这样编辑.csproj文件:

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

答案 3 :(得分:14)

将/ i与xcopy一起使用,如果该目录不存在,则会创建该目录 对你而言。

答案 4 :(得分:6)

您可以使用robocopy:

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

答案 5 :(得分:1)

我试过这个命令。这对我有用。

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

答案 6 :(得分:0)

尝试/ E

获取完整的选项列表:xcopy /?

答案 7 :(得分:0)

一个简单的简短答案是这样的:

xcopy /Y /I "$(SolutionDir)<my-src-path>" "$(SolutionDir)<my-dst-path>\"

答案 8 :(得分:0)

只需输入引号斜杠分隔符 "/" 并添加到最终目标 2 个反斜杠 "\\"

它将创建新文件夹来复制和复制需要的文件(-s)。

xcopy ".\myfile" "....folder1/folder2/destination\\"