当 VisualStudio 告诉我“ xcopy 退出代码4”时,出了什么问题

我不是很熟悉构建后事件,所以我对程序出了什么问题感到有点困惑。2010年在 Visual Studio 中编译时,我得到了以下结果:

The command "xcopy C:\Users\Me\Path\Foo.bar\Library\dsoframer.ocx C:\Users\Me\Path\Foo.bar\bin\Debug\ /Y /E /D
xcopy C:\Users\Me\Path\Foo.bar\ApplicationFiles C:\Users\Me\Path\Foo.bar\bin\Debug\ /Y /E /D
xcopy C:\Users\Me\Path\url\ C:\Users\Me\Path\Foo.bar\bin\Debug\ /Y /E /D
rmdir /S /Q C:\Users\Me\Path\Foo.bar\bin\Debug\.gwt-tmp" exited with code 4.

程序 出现了运行良好,尽管有这个错误,但我不想只是忽略这个问题,希望没有坏事发生。奇怪的是,这一行开始时只有一个命令(第一个 xcopy) ,但随着我继续编译项目(修复其他问题,主要是引用) ,错误消息越来越大。知道是怎么回事吗?

编辑: 以下是似乎正在失败的后期构建事件——

xcopy $(ProjectDir)Library\dsoframer.ocx $(TargetDir) /Y /E /D
xcopy $(ProjectDir)ApplicationFiles $(TargetDir) /Y /E /D
xcopy $(SolutionDir)com.myUrl.gwt\www $(TargetDir) /Y /E /D
rmdir /S /Q $(TargetDir).gwt-tmp
222436 次浏览

Xcopy 退出代码4表示“ 初始化错误。内存或磁盘空间不足,或者您在命令行上输入了无效的驱动器名或语法。

看起来 Visual Studio 向 xcopy 提供了无效的参数。请通过 Project > Right Click > Properties > Build Events > Post Build Event检查后期生成事件命令。

请注意,如果 $(ProjectDir)或类似的宏术语在展开时在结果路径中有空格,那么它们将需要用双引号包装。例如:

xcopy "$(ProjectDir)Library\dsoframer.ocx" "$(TargetDir)" /Y /E /D1

将 watch 选项卡切换到“ output”并查找 xcopy 命令。有时您会在这里找到一些更多的消息(实际的 xcopy 输出) ,它们可以帮助您解决这个问题。如果您没有看到输出选项卡,使用 View-Output 菜单显示它。

除了已接受的答案之外,当目标文件夹是只读的时候也可能出现错误(使用 TFS 时通常会出现这种情况)

如果源文件没有找到,返回错误代码 4也。

正如其他答案所解释的那样,出口代码4可能有许多原因。

我注意到一个案例,其中 结果路径名超过了允许的最大长度(就像 给你)。

对于受影响的后期构建事件,我已经用 robocopy 替换了 xcopy; robocopy 似乎处理的路径略有不同,并且能够完成 xcopy 无法处理的复制任务。

我把这个和信息一起带来了

无效的驱动器规范

在没有指定驱动器名称的情况下复制到网络共享时,例如。

xcopy . \\localhost

哪里

xcopy . \\localhost\share

早就料到了

当 xcopy 命令试图覆盖只读文件时,我收到了‘ 紧急撤离’错误。我设法通过将 /R添加到 xcopy 命令来解决这个问题。/R表示应该覆盖 只读文件

老命令:

XCOPY /E /Y "$(ProjectDir)source file" "destination"

新指挥官

XCOPY /E /Y /R "$(ProjectDir)source file" "destination"

在我的情况下,问题是由于不正确的构建顺序。一个项目在生成后事件上使用 xcopy 命令将文件从 bin 文件夹复制到另一个文件夹。但是由于不正确的依赖关系,当 xcopy 正在进行时,在 bin 文件夹中创建了新文件。

在 VS 中,右键单击有后期构建事件的项目。转到 BuildDependency > ProjectDependency 并确保它是正确的。同时验证项目构建顺序(依赖项的下一个选项卡)。

我遇到了这个问题,所以我从命令行运行 xcopy 命令,它显示:

File creation error - The requested operation cannot be performed on a file with
a user-mapped section open.

实际上是 Visual Studio 在坚持着什么,我刚刚重启了 Visual Studio,它起作用了。

我也有同样的问题。您还可以检查斜杠指向的方向。对我来说,使用反斜杠比使用正斜杠更有效。例子

xcopy /s /y "C:\SFML\bin\*.dll" "$(OutDir)"

而不是:

xcopy /s /y "C:/SFML/bin/*.dll" "$(OutDir)"

在我更新 VS 2017之前,我有一个 post build 命令,它工作得很好。 事实证明,SDK 工具已经更新,并处于一个新的路径下,因此它无法找到我用来为程序集签名的工具。

从这里开始变了。

call "%VS140COMNTOOLS%vsvars32"
"C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6 Tools\x64\sn.exe" -Ra "$(TargetPath)" "$(ProjectDir)Key.snk"

敬这个。

"C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6.1 Tools\x64\sn.exe" -Ra "$(TargetPath)" "$(ProjectDir)Key.snk"

非常微妙但是破坏性的改变,所以如果您看到这个错误,请在更新后检查您的路径。

另一件需要注意的事情是双反斜杠,因为 xcopy在输入路径参数中不能容忍它们(但是 是的在输出路径中可以容忍它们...)。

enter image description here

如果任何其他解决方案处于调试模式,那么首先停止所有解决方案,然后重新启动可视化工作室。这招对我很管用。

这个错误是由于如果有空白的地方,您的回购是复制。 我的项目复制在下面的位置 c://projects/My rest project 然后你可以看到那里的空白,如果你改变你的回购路径到下面,它应该工作 c://projects/myrestproject

如果 目标文件夹由其他一些进程使用。关闭所有可能使用目标文件夹的程序并尝试。

您可以使用资源监视器(Windows 工具)来检查使用目标文件夹的进程。

这招对我管用。