86

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

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

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

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

4

9 回答 9

124

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

于 2012-03-27T15:44:37.543 回答
58

我在命令行上使用

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

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

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

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

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

采用

cmd /? 
mkdir /?
xcopy /?

了解更多信息 :)

于 2011-03-03T02:11:35.910 回答
15

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

  <Target Name="AfterBuild" Inputs="$(TargetPath)\**">
    <Copy SourceFiles="$(TargetPath)\**" DestinationFiles="$(SolutionDir)Prism4Demo.Shell\$(OutDir)Modules\**" OverwriteReadOnlyFiles="true"></Copy>
  </Target>
于 2011-03-03T02:11:46.530 回答
15

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

于 2011-05-07T03:18:24.230 回答
6

您可以使用 robocopy:

robocopy "$(TargetPath)" "$(SolutionDir)Prism4Demo.Shell\$(OutDir)Modules" /E
于 2011-03-03T02:20:51.547 回答
2

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

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

xcopy ".\myfile" "....folder1/folder2/destination\\"
于 2021-07-28T14:13:33.767 回答
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
于 2018-03-30T11:32:25.807 回答
1

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

xcopy /Y /I "$(SolutionDir)<my-src-path>" "$(SolutionDir)<my-dst-path>\"
于 2019-03-08T19:02:54.533 回答
0

试试 /E

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

于 2011-03-03T02:04:11.023 回答