38

我正在开发一个项目,该项目要求将通过构建我的解决方案生成的 DLL 从 bin 文件夹复制到另一个文件夹,这两个文件夹都在我的机器上,在我的 C 驱动器中。我编写了一个使用 xcopy 来完成此任务的批处理文件,您可以在此处看到:

xcopy /s /y /q "C:\Users\scogan\Documents\Visual Studio 2012\Projects\Organizr\Server\bin\Debug\Organizr.Services.dll" "C:\inetpub\wwwroot\AppServer\bin\"
xcopy /s /y /q "C:\Users\scogan\Documents\Visual Studio 2012\Projects\Organizr\Server\bin\Debug\Organizr.Services.pdb" "C:\inetpub\wwwroot\AppServer\bin\"

现在,我已经尝试了这个文件的多次迭代,它位于:

C:\Users\scogan\Desktop\CopyFiles.bat

所以我的构建后事件命令行如下所示:

call C:\Users\scogan\Desktop\CopyFiles.bat

我已经在桌面上的文件夹中使用两个文本文件单独运行了这个批处理文件,它工作正常。我也使用我需要自己复制的文件来运行它,而且效果也很好。但是,当我尝试将其作为构建后事件运行时,我得到以下输出:

1>  Organizr -> C:\Users\scogan\Documents\Visual Studio 2012\Projects\Organizr\Client\bin\Debug\Organizr.exe
1>  File not found - Organizr.Services.dll
1>  0 File(s) copied
1>  0 File(s) copied
1>  File not found - Organizr.Services.pdb
1>c:\Windows\Microsoft.NET\Framework\v4.0.30319\Microsoft.Common.targets(4291,5): error MSB3073: The command "call C:\Users\scogan\Desktop\CopyFiles.bat" exited with code 4.

我做了一些研究,发现错误代码4表示“发生初始化错误。内存或磁盘空间不足,或者您在命令行输入了无效的驱动器名称或语法无效。”

我还查了 MSB3073 是什么,并没有真正找到可以帮助我的东西。所以,我的问题是我做错了什么?绝对路径是否搞砸了?任何帮助在这里表示赞赏。

4

14 回答 14

32

玩弄不同的项目属性,我发现项目构建顺序是问题所在。生成我要复制的文件的项目是第二个构建的,但是作为构建后事件运行批处理文件的项目是首先构建的,所以我只是将构建事件附加到第二个项目,它只是美好的。不过,谢谢大家的帮助。

于 2013-06-13T13:33:56.080 回答
17

更喜欢 AfterBuild 目标中的 MsBuild“复制”任务而不是构建后事件。

将此目标附加到您的项目文件中并删除 PostBuildEvent。

<Target Name="AfterBuild">
    <Copy SourceFiles="C:\Users\scogan\Documents\Visual Studio 2012\Projects\Organizr\Server\bin\Debug\Organizr.Services.*" 
          DestinationFolder="C:\inetpub\wwwroot\AppServer\bin\" 
          OverwriteReadOnlyFiles="true" 
          SkipUnchangedFiles="false" />
</Target>
于 2013-06-12T21:43:20.837 回答
11

对于它的价值,我的问题是由于在copy命令中使用“/”作为目录分隔符引起的。必须使用反斜杠。

于 2015-09-07T00:23:48.057 回答
6

就我而言,我通过构建项目创建的 dll 仍在后台使用。我杀死了应用程序,然后 xcopy 按预期工作正常。

于 2016-11-01T05:03:27.797 回答
5

指定的错误与构建后的事件有关。不知何故,VS 工具无法将文件复制到目标文件夹。可能有很多原因。要检查确切的错误原因,请转到Tools > Option> Project and Solution > Built and run,并将“ MsBuild project build output verbosity ”更改为“ Diagnostic ”。它将为您提供足够的信息来检测实际问题。

于 2018-06-01T09:29:29.580 回答
4

这为时已晚,但将我的经验发布给稍后查看它的人:-

在 MS VS 2010 中,我遇到了同样的问题。它通过在包含空格的构建复制命令 args 中加上引号来解决!

Project Properties --> Configuration Properties --> Build Events --> Post-Build Event --> Command Line变化中:

copy $(ProjectDir)a\b\c $(OutputPath)

copy "$(ProjectDir)a\b\c" "$(OutputPath)"

于 2017-04-13T20:36:53.443 回答
1

如果您遇到复制命令的一些问题,您应该在运行复制命令之前执行以下操作

  1. 以管理员身份打开解决方案并构建解决方案。
  2. 如果您遇到“复制了 0 个文件”之类的问题,请检查源路径和目标路径。你可能使用了错误的路径。如果您在“命令提示符”中运行相同的命令来检查它是否工作正常会更好。
于 2018-11-27T07:01:47.850 回答
1

我通过执行以下操作解决了它:

在 Visual Studio 我进去了Project -> Project Dependencies

我选择了XXX.Test解决方案并告诉它,它还取决于XXX解决方案,以使解决方案中的post-build事件XXX.Test不会产生此错误(退出code 4)。

于 2018-10-05T13:31:20.660 回答
1

导入项目的构建后事件(在属性对话框中的构建事件下)有一个未定义的环境变量。
导航到Control Panel\All Control Panel Items\System\Advanced system settings添加适当的环境变量,并且仅重新启动 VS2017 即可解决该错误。
此外,继@Seas和其他关于多个项目竞赛/争用的答案之后,在输出文件夹中创建一个临时文件夹,如下所示,

像这样

并选择产生首选输出的项目:

在此处输入图像描述

和构建(没有重建/清理)是一个快速的解决方案。

于 2018-01-11T05:34:16.630 回答
1

如果即使将 after build 放入正确的项目后问题仍然存在,请尝试使用“copy”而不是 xcopy。这对我有用。

于 2016-10-05T16:52:38.943 回答
0

从 Github 下载一些源代码后,我收到了这个错误。特别是氧化锈开发框架。我的问题是用于从 Steam 更新某些 dll 的 Steam.ps1 脚本文件被操作系统阻止。我不得不打开文件属性 UNBLOCK 它。我没有意识到这是对 ps1 文件和 exes 完成的。

于 2020-05-10T15:35:20.073 回答
0

我的测试项目遇到了同样的问题。我发现了为什么我的构建后事件不起作用,那是因为我在运行 $(ProjectName).exe 命令之前复制了文件,并且其中一些文件是测试项目本身所必需的。因此,只需将 $(ProjectName).exe 作为第一个命令即可解决问题。

于 2016-10-13T02:59:44.197 回答
0

我最近遇到了这个问题,令人惊讶的是只有我遇到了这个问题,而我的团队成员在构建项目代码时都没有遇到这个问题。

在调试时我发现我的代码目录有间距问题,它是 D:\GIT Workspace\abc\xyz。

作为快速修复,我将其更改为 D:\GITWS\abc\xyz 并解决了问题。

于 2020-02-13T10:01:32.170 回答
0

我发现当您有多个项目并行构建并且一个或多个项目试图复制相同的文件时会发生问题,从而产生会导致偶尔出现错误的竞争条件。那么如何解决呢?

有很多选择,如上所述,只是改变周围的东西可以解决某些人的问题。更强大的解决方案将是......

  • 限制正在复制的文件,即而不是xcopy $(TargetDir)*.*"...而不是xcopy "$(TargetDir)$(TargetName).*"...

  • 捕获错误并重试,即:

    :loop
    xcopy /Y /R /S /J /Q  "$(TargetDir)$(TargetName).*" "somewhere"
    if ErrorLevel 1 goto loop
  • 使用 robocopy 而不是 xcopy

  • 您可能不想这样做,因为它会增加您的构建时间,但您可以将并行项目构建的最大数量减少到1 ...

在此处输入图像描述

于 2017-09-13T02:23:49.167 回答