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


151

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

这是因为无法进行构建后事件。

暂时解决问题的方法

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

这是构建后事件的样子:

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

当您获得命令副本并返回代码[插入值]错误时,通常是由于以下原因:

  • 读/写权限
  • 遗失档案
  • 错误的目录

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

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

您是否遇到过相同的问题并已解决?或您对此有任何解决方案?

Answers:


74

我总是发现这是一个文件锁定问题。代码4是无法访问文件。我发现的一种局部解决方案是对xcopy使用/ C选项(在发生错误时继续执行)。并不是真正的解决方案,但大多数情况下,它阻止了我的构建失败。

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

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


3
我在上面的xcopy命令中添加了/ C选项,并且构建成功。谢谢!解锁器有时是无价的。
Martin S Ek 2010年

2
我遇到了这个问题,因为其中一个文件是只读的。一旦我更改了它,它就会起作用。
鲍勃·霍恩

我还可以证明通过删除对违规文件的只读权限可以解决此问题。我们有一个外部bin文件夹导致了上述问题。一旦删除了只读属性,尝试构建解决方案时该错误就会消失。
eniacAvenger 2014年

3
您指向的解锁器几乎被所有内容检测为病毒。(Google安全浏览的内容,设置,病毒总数...)。似乎是一个关于它的讨论,这里cnet.com/forums/discussions/unlocker-contains-malware-558941
v.oddou

记住这个答案有多老。您所指控的病毒实际上似乎是广告软件,现在似乎捆绑在安装程序中,而不是解锁软件本身。
Preet Sangha

196

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

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

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

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

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


53
'start'为我修复了它...从其他论坛来看,这似乎是一个'start'解决的权限问题,即使目的地在我的盒子上有'Everyone'的FullControl项也是如此。另外,您可以运行'start / MIN xcopy ...'以最小化窗口闪烁
mdisibio 2011年

2
我将c:\ windows \ system32 \ xcopy.exe $ {TargetPath)<目标路径>更改为c:\ windows \ system32 \ xcopy.exe“ $ {TargetPath)” <目标路径>,并且在过去50多个版本中都没有问题建立。
pennyrave 2012年

1
我使用了“ $(OutDir)$(TargetFileName)”,将其更改为“ $(TargetPath)”可以解决此问题。就像使用“开始”一样!
surfen

我的问题似乎是由于在父文件夹名称之一中使用连字符而不是连字符。我从单词中复制/粘贴了分支文件夹的名称时出错,就像“ 1234 – ABCD”一样。将其重命名为“ 1234-ABCD”,xcopy现在可以正常工作。
2014年

添加了start/R,以防万一。谢谢!
sǝɯɐſ 2014年

19

我遇到了相同的错误,但这不是由于文件被锁定,而是文件丢失。

VS之所以尝试复制不存在的文件,是因为使用了“构建后事件”命令。

我清除这些问题后,问题解决了。

更新:

正如@rhughes所说:

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

他是绝对正确的。

在此处输入图片说明


1
如果在构建后复制文件,则可能是因为您在此处输入了命令。真正的问题是如何在这里使命令起作用,而不是删除它。
2013年

9

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

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

另请注意start xcopy,如果编译后错误消失了,该命令将无法修复它。它可能只是被命令行抑制了,实际上没有文件被复制!

您可以在命令外壳中手动执行xcopy命令。在此处执行它们时,您将获得更多详细信息,为您指明正确的方向。


$(OutDir)对我来说也是一样。似乎所有路径宏的末尾都有一个“ \”,这会导致xcopy崩溃
Leo Kolezhuk,

6

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


5

如许多站点所提到的,有多种原因。对我而言,这是由于源和目标的长度(路径长度)引起的。我在命令提示符下尝试了xcopy,但无法键入完整的源代码和路径(某些字符后将不允许您键入)。然后,我减小了路径长度,并且能够运行。希望这可以帮助。



3

我收到此错误的原因是,运行TFS Build Service的用户帐户无权写入目标文件夹。Right-click on the folder-->Properties-->Security


向“ Tangodancer”和“ Abdul Rahman”致敬。右键单击文件夹->属性->安全在独立的XP SP3系统上为我解决了问题谢谢

3

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

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


2

构建完成后,在XCOPY的情况下,我也遇到了同样的问题。在我的情况下,由于在文件夹上设置了只读权限,因此出现了问题。

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

希望它能对某人有所帮助!


2

我在与测试引擎连接的xcopy中遇到了相同的错误。我正在使用VisualStudio Professional2013。默认情况下,“测试”->“测试设置”->“保持测试执行引擎运行”似乎是使用xcopy的错误代码4的原因。将其关闭可以解决该问题。执行引擎似乎保留了某些.dll。


1

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


我遇到了这个问题,“清洁解决方案”并没有帮助我。“清洁解决方案”是否每次都对您有用?
qxotk 2012年

1

我发现将文件的“复制到输出目录”参数设置为“始终复制”似乎可以解决锁定问题。虽然现在我有2个文件副本,但需要删除一个。


1

我有同样的问题。但是,对我没有任何帮助。我通过添加解决了这个问题

exit 0

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

希望这对某人有帮助!


1

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

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

有关robocopy的更多信息,请参见此处


1

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


1

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


1

在编写DLL库时,我使用xcopy命令将库复制到程序可以在其中找到并加载的库。在几次打开和关闭程序后,taskmanager中仍然有一个打开过程,我没有意识到。

查找可以使用该文件的任何进程,然后将其关闭。


1

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

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


1

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

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

一个简单iisreset的为我做的把戏。


1

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

如果$(ConfigurationName)==发布(xcopy“ $(TargetDir) ”“ $(SolutionDir)Deployment \ $(ProjectName)\” / e / d / i / y / e)

观察到“ / e”标志出现了两次。删除重复项可以解决此问题。


1

就我而言,我$(OutDir)只是..\..\Build\一些相对的路径。而且,当我尝试按以下方式进行xcopy时, xcopy /y "$(OutDir)Proj1.dll" "Anypath\anyfolder\"出现退出代码错误4。

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

直到我cd在Post Build事件中写完才能打印出要在哪个目录中执行时,我才能弄清楚。

因此,总而言之,如果我们希望从中使用copy/ xcopy文件$(OutDir),请使用"$(TargetDir)"(这是输出目录的完整路径),或者根本不需要指定任何路径。


0

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

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

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


0

为了扩大对粗暴的答案,

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

0

如果您在这里是因为您的项目无法在构建服务器上构建,而是在开发计算机上“手动”构建良好,而您xcopy只是在调试并在开发计算机上模拟生产环境,那么您可能想看看在此解决方案:

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

您只需使用以下命令在构建服务器上关闭构建后事件

msbuild foo.sln /p:PostBuildEvent=

如果您还有其他需要在构建服务器上运行的构建后事件,这还不够好,这不是一般的解决方案。但是,由于有很多不同的原因导致此问题,所以不能有一个通用的解决方案。该问题(及其重复项)的众多答案之一可能会有所帮助,但请谨慎使用仅能以某种方式规避错误处理的方法(例如xcopy /C)。这些可能对您有用,特别是在构建服务器方案中,但我认为如果可以使用,它会更可靠。

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


0

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

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

msbuild -m:1
msbuild -maxcpucount:1
msbuild

请注意,与这里所说的相反,这甚至发生在MSBuild的``最新''版本中(来自Visual Studio 2019的构建工具)。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.