141

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

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
4

16 回答 16

189

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

看起来 Visual Studio 正在向 xcopy 提供无效参数。通过 . 检查您的构建后事件命令Project > Right Click > Properties > Build Events > Post Build Event

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

xcopy "$(ProjectDir)Library\dsoframer.ocx" "$(TargetDir)" /Y /E /D1
于 2011-04-11T19:40:43.630 回答
38

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

于 2011-04-11T19:54:11.963 回答
32

除了接受的答案之外,当目标文件夹为只读时也会发生错误(使用 TFS 时常见)

于 2013-05-16T08:23:43.013 回答
22

如果找不到源文件,xcopy也会返回错误代码4

于 2014-01-16T06:21:25.070 回答
12

当 xcopy 命令试图覆盖只读文件时,我收到了“ exited with code 4 ”错误。我设法通过将/R添加到 xcopy 命令来解决这个问题。/ R表示只读文件应该被覆盖

旧命令:

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

新命令

XCOPY /E /Y /R "$(ProjectDir)source file" "destination"
于 2016-03-24T11:48:24.180 回答
8

正如其他答案所解释的,退出代码 4可能有很多原因。

我注意到一个案例,其中生成的路径名超过了允许的最大长度(就像这里一样)。

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

于 2014-02-02T11:32:56.183 回答
5

这意味着

发生初始化错误。没有足够的内存或磁盘空间,或者您在命令行中输入了无效的驱动器名称或无效的语法。

所以基本上它可以是任何东西哈哈......尝试从命令提示符一次运行一个命令,以确定哪个命令的哪一部分给你带来了麻烦。

于 2011-04-11T19:40:36.053 回答
3

此错误是由于复制您的存储库时是否存在空格。例如,我的项目被复制到下面的位置, c://projects/My rest project 然后你可以在那里看到空格,如果你将你的 repo 路径更改为下面,它应该可以工作 c://projects/myrestproject

于 2020-02-13T08:57:33.630 回答
3

如果目标文件夹被其他一些进程使用,也会出现这种情况。关闭所有可能使用目标文件夹的程序并尝试。

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

这对我有用!

于 2020-07-06T05:58:12.447 回答
3

我收到了这个消息

驱动器规格无效

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

xcopy . \\localhost

在哪里

xcopy . \\localhost\share

预计

于 2015-09-15T14:23:49.780 回答
2

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

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

它实际上是 Visual Studio 持有的东西。我刚刚重新启动了 Visual Studio,它工作正常。

于 2017-09-13T20:38:17.330 回答
1

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

在 VS 中,右键单击您有构建后事件的项目。转到 Build Dependencies > Project Dependencies 并确保其正确。还要验证项目构建顺序(依赖项的下一个选项卡)。

于 2016-08-31T06:40:52.343 回答
0

如果任何其他解决方案处于调试模式,则首先将它们全部停止,然后重新启动 Visual Studio。它对我有用。

于 2019-10-04T07:41:45.290 回答
0

我有同样的问题。您还可以检查斜线指向的方向。对我来说,它可以使用反斜杠,而不是正斜杠。例子

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

代替:

xcopy /s /y "C:/SFML/bin/*.dll" "$(OutDir)"
于 2018-12-11T16:07:51.710 回答
0

在我对 VS 2017 进行更新之前,我有一个构建后命令运行良好。事实证明,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"

非常微妙但破坏性的更改,因此如果您看到此错误,请在更新后检查您的路径。

于 2019-01-15T18:31:22.830 回答
0

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

在此处输入图像描述

于 2019-01-16T18:55:49.783 回答