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

问题描述 投票:70回答:8

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

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

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

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

xcopy post-build-event
8个回答
46
投票

我在命令行上尝试了这个

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

并正确创建了目标目录。

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

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

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

使用

cmd /? 
mkdir /?
xcopy /?

了解更多信息 :)


109
投票

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


15
投票

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

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

14
投票

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


6
投票

你可以使用robocopy:

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

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

0
投票

试试/ E

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


0
投票

简单的简短回答是这样的:

xcopy /Y /I "$(SolutionDir)<my-src-path>" "$(SolutionDir)<my-dst-path>\"
© www.soinside.com 2019 - 2024. All rights reserved.