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

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

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

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

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

【问题讨论】:

  • 查看我对已接受答案的评论

标签: xcopy post-build-event


【解决方案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=%1 和 SET filepath=%~dp1 和 SET filename=%~n1 和 SET destination=c:\path\folder ) : ROBOCOPY "%filepath% " "%destination%" "% filename%" /B /COPY:DT /XJ /SL /R:0 /W:0 /V (“%filepath%”中的空格是必须的,不是错误)。
          【解决方案9】:

          试试 /E

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

          【讨论】:

          • 谢谢,但 /e 用于复制源中现有的子目录结构。我正在将源根目录中的文件复制到目标中的新子目录。
          猜你喜欢
          • 2012-11-20
          • 1970-01-01
          • 2014-11-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-01-01
          • 1970-01-01
          相关资源
          最近更新 更多