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

Posted

技术标签:

【中文标题】如果指定目录不存在,XCOPY 切换创建指定目录?【英文标题】:XCOPY switch to create specified directory if it doesn't exist? 【发布时间】:2011-07-07 17:50:18 【问题描述】:

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

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

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

如果文件夹不存在,是否有一个 XCOPY 开关会导致创建该文件夹?如果没有,如果文件夹不存在,我会在构建后事件中添加什么来创建文件夹?感谢您的帮助。

【问题讨论】:

查看我对已接受答案的评论 【参考方案1】:

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

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

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

【讨论】:

【参考方案2】:

简单的回答是这样的:

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

【讨论】:

【参考方案3】:

我在命令上试过这个。它对我有用。

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

【讨论】:

【参考方案4】:

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

【讨论】:

如果详细说明为什么使用/F,为什么使用/R,为什么使用/Y,答案应该会更有用。在我的例子中,/Y 解决了这个问题,未来的读者将受益于知道为什么没有数据挖掘互联网。 如果我需要创建两个目录怎么办? xcopy 可以帮我做吗? 在我的例子中,/I 不是有条件地创建目录所必需的,而是 +1 以用反斜杠结束路径。 直到研究命令行选项是“互联网数据挖掘”。 :)【参考方案5】:

我在命令行上试过这个

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

并且目标目录已正确创建。

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

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

('/x' 启用命令扩展,以防它们在您的系统上默认未启用,我对cmd不太熟悉)

使用

cmd /? 
mkdir /?
xcopy /?

更多信息:)

【讨论】:

我接受了这个答案,因为第一部分证明是正确的。 XCOPY 创建目录,如果它不存在的话。我发现 Windows 试图要求对我的 XCOPY 命令进行覆盖确认。 VS 不允许这样做,所以它以代码 2 退出。我添加了 /y 参数,它抑制了提示,并且命令有效。通过清理解决方案并删除文件夹然后重建进行测试。文件夹由 XCOPY 创建。 @DavidVeeneman 这在 Windows 10 下的 VS2015 中不起作用; xcopy 错误并显示消息“错误:无效路径”。所以不行。 xcopy 不会(总是)创建目标目录 XCOPY 确实会创建目录,但只有在没有歧义的情况下才会这样做: 这是不明确的:D:\>xcopy myfile.dat xcopytest\test 这不是:D:\>xcopy myfile.dat xcopytest\test\(注意最后一个'\')【参考方案6】:

将 /i 与 xcopy 一起使用,如果目录不存在,它将创建目录 给你。

【讨论】:

【参考方案7】:

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

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

【讨论】:

我认为您的 Inputs、SourceFiles 和 DestinationFiles 不正确。他正在将 DDL 复制到模块文件夹,而不是反过来。 无论如何我都会将它们添加到属性组中。 Inputs="..." 应该被删除。在 VS 2012 中,我收到一条错误消息,指出““AfterBuild”目标缺少其输出规范。如果目标声明输入,它还必须声明输出。” $(TargetPath) 是输出 .DLL 文件的文件路径,因此可能还应该从 SourceFiles 值中删除 \**。 如果您删除 Inputs="" 您将失去构建跟踪。这是一个两年前的问题,如果您想更新它,请随时。【参考方案8】:

您可以使用 robocopy:

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

【讨论】:

+1:我不知道 Vista 和 Win7 中可用的 robocopy 命令。谢谢。不过,不要认为它会在这里工作。我正在复制一个文件,而不是一个文件夹。 我也不知道 robocopy。很高兴知道,但不幸的是,如果复制到 Program Files 下的文件夹,它会失败并显示“访问被拒绝”消息。 (xcopy 对此没有问题。) 经过进一步研究,看起来 xcopy 可能很乐意将新文件复制到 Program Files 下的现有文件夹中,但它显然也无法创建新文件夹(没有管理员权限)。 这是如何在批处理文件中使用 Robocopy 仅复制文件(需要 SET file=%1SET filepath=%~dp1SET filename=%~n1SET destination=c:\path\folder ) : ROBOCOPY "%filepath% " "%destination%" "% filename%" /B /COPY:DT /XJ /SL /R:0 /W:0 /V (“%filepath%”中的空格是必须的,不是错误)。【参考方案9】:

试试 /E

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

【讨论】:

谢谢,但 /e 用于复制源中现有的子目录结构。我正在将源根目录中的文件复制到目标中的新子目录。

以上是关于如果指定目录不存在,XCOPY 切换创建指定目录?的主要内容,如果未能解决你的问题,请参考以下文章

java调用copy复制子文件夹及文件到指定目录(非xcopy)

c#如何复制文件夹到新目录

bat文件xcopy指令?

XCOPY——目录复制命令

bat文件xcopy指令?

xcopy-参数详解