构建时命令副本以代码 4 退出 - Visual Studio 重新启动解决了它

Posted

技术标签:

【中文标题】构建时命令副本以代码 4 退出 - Visual Studio 重新启动解决了它【英文标题】:Command copy exited with code 4 when building - Visual Studio restart solves it 【发布时间】:2011-04-21 03:52:05 【问题描述】:

当我在这里构建解决方案时(其中包含 7 个项目)时不时地在 Visual Studio 2010 Premium ed 中收到可怕的“命令副本退出,代码 4”错误。

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

这是暂时解决问题的方法

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

这是构建后事件的样子:

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

当你得到 command copy exited with code [insert value] 错误时,通常是因为以下原因:

读/写权限 缺少文件 错误的目录

但是 - 显然,有时当我构建解决方案时,没有问题。

仅供参考,两周前我卸载了 ReSharper 5.1.1,此后 Visual Studio 一直给我一些错误(其中包括无法调试)。我重新安装了 Visual Studio,从那以后它工作得更好,但仍然遇到这个问题。可能与某些 ReSharper 的东西在某个地方有关吗?

你有同样的问题并解决了吗?或者你有什么可能的解决方案?

【问题讨论】:

【参考方案1】:

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

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

有时如果文件是只读的,也会引起问题。添加/R 选项以允许复制只读文件。您可以在以下位置找到可用选项列表:

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

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

【讨论】:

'start' 为我修复了它......从其他论坛来看,这似乎是一个权限问题,'start' 解决了,即使目的地在我的盒子上有 FullControl for 'Everyone'。另外,你可以运行'start /MIN xcopy...'来最小化窗口闪烁 我将 c:\windows\system32\xcopy.exe $(TargetPath) 更改为 c:\windows\system32\xcopy.exe "$(TargetPath)" 和在过去的 50 多个构建中没有问题。 我使用了“$(OutDir)$(TargetFileName)”,将其更改为“$(TargetPath)”即可解决问题。就像使用“开始”一样! 我的问题似乎来自在父文件夹名称之一中使用短划线字符而不是连字符。我从 word 中复制/粘贴分支文件夹的名称时犯了一个错误,类似于“1234 - ABCD”。将其重命名为“1234 - ABCD”,xcopy 现在可以正常工作了。 添加了start/R,以防万一......不确定是哪一个成功了,但它成功了!谢谢!【参考方案2】:

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

另一种仅适用于 32 位的解决方案是使用unlocker 工具在复制之前释放文件上的 Windows 句柄。

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

【讨论】:

我在上面的 xcopy 命令中添加了 /C 选项,构建成功。谢谢!解锁器有时非常宝贵。 我遇到了这个问题,因为其中一个文件是只读的。一旦我改变了它,它就起作用了。 我也可以证明这个问题是通过删除有问题的文件的只读权限来解决的。我们有一个导致所描述问题的外部 bin 文件夹。删除只读属性后,尝试构建解决方案时错误消失。 你指向的这个解锁器几乎被所有东西检测为病毒。 (谷歌安全浏览的东西,eset,virustotal ......)。似乎在这里讨论它cnet.com/forums/discussions/unlocker-contains-malware-558941 记住这个答案的年龄。您声称的病毒实际上似乎是广告软件,现在似乎捆绑在安装程序中,而不是解锁软件本身。【参考方案3】:

我也遇到了同样的错误,但不是因为文件被锁定,而是文件丢失了。

VS 试图复制一个不存在的文件的原因是因为 Post-build 事件命令。

在我清除之后,问题就解决了。

更新:

正如@rhughes 评论的那样:

真正的问题是如何让命令在这里工作,而不是 删除它。

他是绝对正确的。

【讨论】:

如果您在构建后复制文件,很可能是因为您在此处输入了命令。真正的问题是如何让命令在这里工作,而不是删除它。【参考方案4】:

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

就我而言,拖尾 \ 正在使 xcopy 崩溃(因为我使用的是 $(TargetDir))。在我的情况下$(SolutionDir)..\bin。如果您使用任何其他输出,则需要进行调整。

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

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

【讨论】:

$(OutDir) 也发生在我身上。似乎所有路径宏最后都有一个“\”,它会崩溃 xcopy【参考方案5】:

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

【讨论】:

【参考方案6】:

正如许多网站所提到的,这有多种原因。对我来说,这是由于源和目标的长度(路径长度)。我在命令提示符下尝试了 xcopy,但无法输入完整的源代码和路径(在某些字符之后它不允许您输入)。然后我减少了路径长度并能够运行。 希望这会有所帮助。

【讨论】:

【参考方案7】:

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

    当完整的字符串路径超过 254 个字符时。 当要复制的文件名错误时。 当目标路径错误时。 在复制的文件或目标文件夹上设置只读属性时。

【讨论】:

【参考方案8】:

我收到此错误是因为运行 TFS 构建服务的用户帐户没有写入目标文件夹的权限。 Right-click on the folder-->Properties-->Security.

【讨论】:

向“Tangodancer”和/或“Abdul Rahman”致敬。右键单击文件夹-->属性-->安全解决了我在独立 XP SP3 系统上的问题 谢谢【参考方案9】:

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

【讨论】:

我以管理员身份运行 VS,但这对我不起作用。 部分用户可能无法在管理员模式下运行。【参考方案10】:

我收到此错误是因为该文件已在另一个实例中打开。

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

【讨论】:

【参考方案11】:

在构建完成后 XCOPY 的情况下,我遇到了同样的问题。就我而言,问题的发生是因为文件夹上设置了只读权限。

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

希望它对某人有所帮助!

【讨论】:

【参考方案12】:

在与测试引擎相关的 xcopy 中,我遇到了同样的错误。我正在使用 VisualStudio Professional 2013。默认情况下,测试 -> 测试设置 -> 保持测试执行引擎运行似乎是我的 xcopy 错误代码 4 的原因。关闭它解决了这个问题。执行引擎似乎保留了一些 .dll。

【讨论】:

【参考方案13】:

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

【讨论】:

我遇到了这个问题,“干净的解决方案”对我没有帮助。 “清洁解决方案”是否每次都适合您?【参考方案14】:

我发现将文件的 Copy To Output Directory 参数设置为 Copy Always 似乎已经解决了锁定问题。虽然现在我有 2 个文件副本,需要删除一个。

【讨论】:

【参考方案15】:

我遇到了同样的问题。然而,没有什么对我有用。我通过添加解决了这个问题

exit 0

我的代码。问题是,当我在复制文件时,有时找不到最后一个文件,并且 bat 返回一个非零值。

希望这对某人有所帮助!

【讨论】:

【参考方案16】:

如果您运行的是 Windows 7 及更高版本,您可以尝试新的“robocopy”命令:

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

有关 robocopy 的更多信息,请访问here。

【讨论】:

【参考方案17】:

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

【讨论】:

【参考方案18】:

我使用带有 /exclude 选项的 xcopy 得到了类似的结果。就我而言,我发现编辑构建后事件(命令后的换行符等无害的东西)并保存项目会导致错误发生。重新保存 /exclude 选项中指定的文件会使其再次工作。

【讨论】:

【参考方案19】:

在编写 DLL 库时,我使用 xcopy 命令将库复制到程序可以找到并加载它的位置。在多次打开和关闭程序后,任务管理器中仍然有一个我无法识别的打开进程。

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

【讨论】:

【参考方案20】:

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

请尝试 - 我尝试了这里提到的所有其他方法,但无济于事。

【讨论】:

【参考方案21】:

我在这里没有看到任何暗示这是一个网络应用程序的信息,但我自己也遇到过这个问题 - 我在构建后事件中有两个 xcopy 命令,但只有一个失败了。文件被锁定了,不是 Visual Studio(因为我尝试重新启动它。)

唯一会使用我构建的 dll 的其他东西是 IIS。你瞧,

一个简单的iisreset 对我有用。

【讨论】:

【参考方案22】:

我遇到了同样的问题。 这是由于两次使用相同的标志引起的,例如:

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

观察“/e”标志出现了两次。删除副本解决了这个问题。

【讨论】:

【参考方案23】:

就我而言,我的$(OutDir) 只是..\..\Build\,即一些相对路径。而且,当我试图 xcopy 如下 xcopy /y "$(OutDir)Proj1.dll" "Anypath\anyfolder\" 我收到退出代码错误 4。

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

直到我在 Post Build 事件中写了 cd 以打印在哪个目录中执行它时,我才弄清楚这一点。

所以,总而言之,如果我们希望从$(OutDir) 中获取copy / xcopy 文件,要么使用"$(TargetDir)"(这是输出目录的完整路径),要么根本不需要指定任何路径.

【讨论】:

【参考方案24】:

可能由带有共享文件夹的 VMWare 工作站引起

xcopy 的destinatinon 文件夹也映射为VM 中的共享文件夹时,我总是遇到问题。

我通过在 vm 中运行的脚本并删除共享文件夹的内容来解决它。

【讨论】:

【参考方案25】:

为了扩展 rhughes 的答案,

robocopy 运行良好,如果您需要包含子目录,您可以使用 /e 包含子目录并复制空目录或使用 /s 包含子目录,但不包括空目录。

robocopy 还会报告一些事情,例如是否复制了新文件,这将导致 VS 抱怨,因为高于 0 的任何内容都是失败的,如果找到了新文件,robocopy 将返回 1。值得一提的是,robocopy 首先比较 Source/Dest,并且只复制更新/新文件。

绕过这个用途:

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

【讨论】:

【参考方案26】:

如果您在这里是因为您的项目无法在构建服务器上构建,但在开发机器上“手动”构建良好,并且您正在执行 xcopy 仅用于调试和模拟开发机器上的生产环境,那么你可能想看看这个解决方案:

https://***.com/a/1732478/2279059

您只需使用

关闭构建服务器上的构建后事件
msbuild foo.sln /p:PostBuildEvent=

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

还建议使用较新版本的 Visual Studio,问题不再存在,因此如果您使用的是旧版本,请考虑更新您的构建工具。

【讨论】:

【参考方案27】:

错误代码 4 可能意味着很多事情,因此我建议您也阅读其他答案,直到您找到适合您的解决方案并且您了解它为什么有效(某些解决方案仅禁用错误处理,这可能只会掩盖问题但不解决)。

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

msbuild -m:1
msbuild -maxcpucount:1
msbuild

请注意,与此处所说的相反,即使是“最新”版本的 MSBuild(来自 Visual Studio 2019 的构建工具)也会发生这种情况。

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

【讨论】:

【参考方案28】:

我想放大和具体化这两个答案:@Vemul's、@Srihari Chinna's。

确保您的 source 路径存在并且进程可以访问它。 如果您使用变量替换来组装源路径,则尤其如此。

【讨论】:

以上是关于构建时命令副本以代码 4 退出 - Visual Studio 重新启动解决了它的主要内容,如果未能解决你的问题,请参考以下文章

错误 MSB3073:命令“grunt dist”在 Visual Studio 2017 中以代码 3 退出

Hololens 构建失败 - 命令 AssemblyConverter.exe 以代码 1 退出

Visual Studio 中 Opencv 的介绍性示例程序以代码 -1 退出。没理由

Visual Studio 预构建事件:批处理文件退出代码为 -1

Visual Studio Autodeploy - nuget命令失败,退出代码和错误NU1102

试图将 python 嵌入到 Visual Studio 2010 C++ 文件中,并以代码 1 退出