如果指定目录不存在,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=%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 用于复制源中现有的子目录结构。我正在将源根目录中的文件复制到目标中的新子目录。以上是关于如果指定目录不存在,XCOPY 切换创建指定目录?的主要内容,如果未能解决你的问题,请参考以下文章