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

Dav*_*man 72 xcopy post-build-event

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

xcopy  "$(TargetPath)" "$(SolutionDir)Prism4Demo.Shell\$(OutDir)Modules\" 
Run Code Online (Sandbox Code Playgroud)

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

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

psu*_*lek 111

回答使用"/ I"正在工作,但有一点技巧 - 在目标中你必须以字符\结束告诉xcopy目标是目录而不是文件!

例:

xcopy "$(TargetDir)$(TargetName).dll" "$(SolutionDir)_DropFolder" /F /R /Y /I
Run Code Online (Sandbox Code Playgroud)

不起作用并返回代码2,但这一个:

xcopy "$(TargetDir)$(TargetName).dll" "$(SolutionDir)_DropFolder\" /F /R /Y /I
Run Code Online (Sandbox Code Playgroud)

我的示例中使用的命令行参数:

/ F - 显示完整的源文件名和目标文件名

/ R - 这将覆盖只读文件

/ Y - 禁止提示覆盖现有文件

/ I - 假设目的地是目录(但必须以\结尾)

  • 如果详细阐述为什么使用`/ F`,为什么`/ R`,为什么`/ Y`,答案应该更有用.在我的情况下,`/ Y`解决了这个问题,未来的读者将从知道为什么没有数据挖掘互联网中受益. (3认同)
  • http://www.computerhope.com/xcopyhlp.htm.这将有助于命令. (3认同)
  • 在我的例子中,为了有条件地创建目录,不需要`/ I`,但是用于以反斜杠结束路径的+1. (2认同)

Mar*_*ner 46

我在命令行上尝试了这个

D:\>xcopy myfile.dat xcopytest\test\
Run Code Online (Sandbox Code Playgroud)

并正确创建了目标目录.

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

cmd /x /c mkdir "$(SolutionDir)Prism4Demo.Shell\$(OutDir)Modules\"
Run Code Online (Sandbox Code Playgroud)

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

使用

cmd /? 
mkdir /?
xcopy /?
Run Code Online (Sandbox Code Playgroud)

了解更多信息 :)

  • 我接受了这个答案,因为第一部分证明是正确的.如果目录尚不存在,XCOPY*将*创建目录.我发现Windows试图在我的XCOPY命令上要求覆盖确认.VS不允许这样做,所以它退出了Code 2.我添加了/ y param,它会提示,并且命令有效.通过清理解决方案并删除文件夹进行测试,然后重建.文件夹由XCOPY创建. (11认同)
  • XCOPY确实创建了目录,但只有在没有歧义的情况下才会这样做:这是不明确的:D:\> xcopy myfile.dat xcopytest\test这不是:D:\> xcopy myfile.dat xcopytest\test \(注意最后一个'\') (2认同)

Rit*_*ton 15

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

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


小智 14

将/ i与xcopy一起使用,如果目录不存在,它将为您创建目录.


Joh*_*ons 6

你可以使用robocopy:

robocopy "$(TargetPath)" "$(SolutionDir)Prism4Demo.Shell\$(OutDir)Modules" /E
Run Code Online (Sandbox Code Playgroud)