命令副本在生成时与代码4一起退出-VisualStudio 重新启动解决了这个问题

在 Visual Studio 2010 Premium ed 中,当我在这里构建我的解决方案(包含7个项目)时,我不时会遇到可怕的“ Command copy exite with code 4”错误。

这是因为构建后事件无法通过。

以下是暂时解决问题的方法

  • 有时候: 重新启动 VisualStudio,我就能够构建解决方案
  • 有时候: 重新启动 Visual Studio 和我选择的文件管理器(Q-Dir 4.37)都可以解决这个问题。

下面是构建后事件的外观:

xcopy "$(SolutionDir)Solution Items\References\*.dll" "$(TargetDir)" /Y

当命令副本因为代码[ insert value ]错误而退出时,通常是由于以下原因:

  • 读/写权限
  • 丢失的文件
  • 错误的目录

然而,当我构建解决方案的时候,显然没有问题。

仅供参考,我在两周前卸载了 ReSharper 5.1.1,从那时起 Visual Studio 就给了我一些错误(其中包括无法调试)。我重新安装了 Visual Studio,从那以后工作得更好了,但还是有这个问题。会不会是因为 ReSharper 的东西在某个地方?

你是否遇到过同样的问题并解决了它? 或者你有任何可能的解决办法吗?

177021 次浏览

我总是发现这是一个文件锁定问题。代码4是无法访问文件。我找到的一个部分解决方案是对 xcopy 使用/C 选项(错误继续)。这不是一个真正的解决方案,但是它基本上阻止了我的构建失败。

另一种只能在32位上运行的解决方案是使用 开锁工具在复制之前释放文件上的窗口句柄。

编辑: 我刚刚意识到它也可以在64位以下工作。

虽然 /C可能会忽略错误,但它可能不是真正的解决方案,因为有些文件必须复制才能使构建成功。

最常见的问题是在预定义的命令标记(例如 $TargetDir)周围缺少引号。当在代码或 TFS 中创建各种分支和路径时,这种情况很有可能发生。

有时,如果文件是只读的,也会导致问题。添加 /R选项以允许复制只读文件。你可在以下网址找到可供选择的清单:

Http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/xcopy.mspx?mfr=true

另一个可能的问题是无法访问基础文件夹。如果是这样,尝试执行 "start xcopy"而不是 "xcopy"。这将打开另一个命令窗口,但具有管理特权。

之所以出现这个错误,是因为运行 TFS Build Service 的用户帐户没有写入目标文件夹的权限。Right-click on the folder-->Properties-->Security.

我得到这个错误是因为文件是在另一个实例中打开的。

当我关闭文件并重新构建解决方案时,它被成功复制。

我也有同样的问题。 VS 中一个简单的“干净解决方案”清除了错误,但这是一个临时解决方案。

如果 post build 事件包含 copy/xcopy 命令,用于将 build 输出复制到某个目录(这通常是最常见的 post build 操作) ,那么如果源目标或目标目录的完整目录路径包含包含空格的文件夹名,就会出现问题。删除目录名称的空间,然后尝试。

我跨越了同样的错误,但它不是由于文件被锁定,而是文件丢失。

VS 之所以尝试复制一个不存在的文件,是因为 Post-build 事件命令。

我搞定之后,问题就解决了。

更新:

正如@rhughs 所评论的:

真正的问题是如何让这里的命令工作,而不是工作 取出来。

他说的完全正确。

enter image description here

正如许多网站所提到的,造成这种情况的原因是多方面的。对我来说,这是由于源和目的地的长度(路径长度)。我在命令提示符中尝试了 xcopy,但是无法键入完整的源和路径(在一些字符之后,它不允许您键入)。然后,我减少了路径长度,并能够运行。 希望这个能帮上忙。

这种情况可能在多种情况下发生:

  1. 当完整的字符串路径长于254个字符时。
  2. 当要复制的文件名称错误时。
  3. 当目标路径错误时。
  4. 在复制的文件或目标文件夹上设置 readonly 属性时。

我发现将文件的 CopyToOutputDirectory 参数设置为 CopyAlways 似乎已经解决了锁定问题。不过现在我有两份文件,需要删除一份。

我也有同样的问题。但是,没有一个对我有用。我通过加法解决了这个问题

exit 0

我的原则。问题在于,当我复制文件时,有时无法找到最后一个文件,并且 bat 返回一个非零值。

希望这对谁有帮助!

如果你正在运行 Windows7,你可以尝试新的“ robocopy”命令:

robocopy "$(SolutionDir)Solution Items\References\*.dll" "$(TargetDir)"

更多关于机器人复制的信息可以找到 给你

我也遇到过这个问题。请仔细检查错误窗口中的结果。

在我的例子中,尾随的 \正在崩溃 xcopy (因为我正在使用 $(TargetDir))。在我的情况下 $(SolutionDir)..\bin。如果您使用任何其他输出,这需要进行调整。

还要注意,如果编译后错误消失,start xcopy不会修复它。它可能只是被命令行禁止,并且实际上没有复制任何文件!

您可以在命令 shell 中手动执行 xcopy 命令。在那里执行它们时,您将获得更多的细节,为您指明正确的方向。

在管理员模式下运行 VS,应该可以正常工作。

在构建完成后使用 XCOPY 时,我遇到了同样的问题。在我的案例中,问题的发生是因为对文件夹设置了 READ-ONLY 权限。

我在 XCOPY 之前添加了 Attrib-R 命令,它解决了这个问题。

希望能帮到别人!

我也面临同样的问题。 我删除了构建后的事件,它就开始工作了。 有时当我们添加一些 SQL 组件时,它也可能添加后期生成命令。

我正在使用 xcopy 和/ 排除選擇來得到相似的效果。在我的例子中,我发现编辑生成后事件(无害的东西,比如命令后的换行符)和保存项目会导致错误发生。重新保存/撒除选项中指定的文件将使其再次工作。

与测试引擎相关的 xcopy 也有同样的错误。我正在使用 VisualStudio Professional 2013。默认情况下,Test-> Test Settings-> Keep Test Execution Engine Running 似乎是我使用 xcopy 的错误代码4的原因。把它关掉就解决问题了。执行引擎似乎保持了一些。Dls.

在编写 DLL 库时,我使用 xcopy 命令复制程序可以找到并加载它的库。在打开和关闭程序几次之后,在 TaskManager 中仍然有一个打开的进程,我没有认出来。

查找可以使用该文件的任何进程并关闭它。

是什么改变了我: 深入到您想要的项目的特定解决方案,即不是所有项目的整体解决方案文件。

一定要试试——我试了这里提到的所有其他方法,但都没有用。

我在这里没有看到任何东西暗示这是一个网络应用程序,但我自己也经历过这个问题-我有两个 xcopy 命令在后期构建事件,只有一个是失败的。有些东西在文件上有一个锁,它不是 VisualStudio (我试图重新启动它)

唯一能使用我构建的 dll 的东西就是 IIS 你瞧,

一个简单的 iisreset就帮了我大忙。

我也有同样的问题。 这是由于同一面旗帜出现了两次,例如:

如果 $(ConfigurationName) = = Release (xcopy“ $(TargetDir) .”“ $(SolutionDir) Deployment $(ProjectName)”/e/d/i/y/e)

请注意,“/e”标志出现了两次。删除重复标志解决了这个问题。

可能是由于共享文件夹的 VMware Workstation 引起的

xcopy的目标文件夹也被映射为 VM 中的共享文件夹时,我总是遇到这个问题。

我用一个运行在 vm 中的脚本解决了这个问题,并删除了共享文件夹的内容。

在我的例子中,我的 $(OutDir)是简单的 ..\..\Build\,也就是某个相对路径。当我试图像下面这样复制时 我得到的是出口代码错误4。

发生的情况是,这个命令是在 $(OutDir)(在我的例子中是 build 文件夹)本身中执行的,而不是项目的 csproj 文件所在的目录(正如我们通常期望的那样)。因此,我一直得到 File not found错误(对应于退出代码4)。

直到我在 Post Build 事件中编写了 cd来打印在哪个目录中执行这个命令,我才弄明白这个问题。

因此,总结一下,如果我们希望从 $(OutDir)获得 copy/xcopy文件,可以使用 "$(TargetDir)"(输出目录的完整路径) ,或者根本不需要指定任何路径。

为了详细说明休斯的回答,

机器人复制工程漂亮,只是如果你需要包括子目录,你可以使用 /e包括子和复制空目录或 /s包括子不包括空目录。

同样,如果新文件被复制,机器人复制也会报告一些东西,这会导致 VS 抱怨,因为任何高于0的东西都是失败的,如果发现新文件,机器人复制将返回1。值得一提的是,robocopy 首先比较 Source/Dest,然后只复制更新/新文件。

避免使用:

(robocopy "$(SolutionDir)Solution Items\References\*.dll" "$(TargetDir)") ^& IF %ERRORLEVEL% LEQ 4 exit /B 0

如果你在这里是因为你的项目没有构建在构建服务器上,而是在开发机器上“手动”构建了很好的版本,而你只是为了调试和模拟开发机器上的生产环境而使用 xcopy,那么你可能想看看这个解决方案:

Https://stackoverflow.com/a/1732478/2279059

只需关闭生成服务器上的后生成事件

msbuild foo.sln /p:PostBuildEvent=

如果您有其他也需要在构建服务器上运行的后期构建事件,而且这不是一个通用的解决方案,那么这还不够好。然而,由于这个问题有这么多不同的原因,不可能有一个普遍的解决办法。这个问题的众多答案之一(及其副本)可能会有所帮助,但是对于那些只能以某种方式规避错误处理(如 xcopy /C)的方法,要小心。这些方法可能对您有用,特别是在构建服务器场景中,但是我认为如果可以使用的话,这个方法更可靠。

还有人建议,对于较新版本的 VisualStudio,这个问题不再存在,因此如果您使用的是旧版本,请考虑更新您的构建工具。

错误代码4可能意味着很多东西,所以我建议你也阅读其他的答案,直到你找到一个适合你的解决方案,并且你明白为什么它有效(一些解决方案只禁用错误处理,这可能只是掩盖了问题,但不能解决它)。

这可能是与并行构建相关的文件锁定问题。解决方案是不使用并行构建。这是默认行为,但是如果您使用 -m选项,那么项目将并行构建。下列变体不应该并行构建项目,因此您不会遇到文件锁定问题。

msbuild -m:1
msbuild -maxcpucount:1
msbuild

请注意,与这里所说的相反,这种情况甚至发生在 MSBuild 的“最新”版本(来自 Build Tools for Visual Studio 2019)中。

最好的解决方案可能是确保不需要在构建后的步骤中复制文件。在某些情况下,还可以在生成服务器 https://stackoverflow.com/a/55899347/2279059上使用 MSBuild 生成时禁用生成后步骤

我想放大并具体化这两个答案: @ Vemul’s@ Srihari Chinna’s

  • 确保您的 来源路径存在,并且进程可以访问它。
    • 如果您使用变量替换来装配源路径,这一点尤其正确。