当Visual Studio告诉我“ xcopy已退出代码4”时出了什么问题?


125

我对构建后事件不是很熟悉,所以我对程序出了什么问题感到困惑。在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)开始,但是随着我继续编译项目(修复其他问题,主要是引用),错误消息越来越大。知道会发生什么吗?

编辑:这是似乎失败的postbuild事件-

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

2
除了下面的答案,也一定要打开VS用Administrator privileges。复制到特定位置需要管理员权限。
Nikhil Agrawal

Answers:


166

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

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

请注意,如果$(ProjectDir)或相似的宏术语在展开时的结果路径中有空格,则需要将其用双引号引起来。例如:

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

就像我说的,我对构建后事件脚本了解不多(我也不写这些脚本)。我在哪里找到这个?
Raven Dreamer

1
转到项目属性>生成事件
马克CIDADE

2
尝试用双引号("command args")将每个命令包装起来。
格兰·托马斯

@Mark Cidade-我似乎在任何地方都没有“ Build Events”。列出的常见属性:“启动项目;项目依赖关系;调试源文件;代码分析设置”。列出的配置属性:“配置”。
Raven Dreamer

4
@RavenDreamer:如果$(ProjectDir)(和/或类似名称)扩展路径中有空格,则需要将其用引号引起来。例如:xcopy "$(ProjectDir)Library\dsoframer.ocx" "$(TargetDir)" /Y /E /D1
Grant Thomas

34

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


30

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


2
而且,如果您像下面提到的@FelicePollano一样切换到输出窗口,则可以看到一些内容。
Jedidja

20

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


3
这是我的情况。我用以。$(TargetDir)结尾的 对我而言毫无拖尾的Release\ 使用$(ProjectDir)\bin\Release\\
-Multinerd

12

当xcopy命令试图覆盖一个只读文件时,我收到了“ 代码退出4 ”错误。我设法通过在xcopy命令中添加/ R来解决此问题。该/ R表示只读文件应该被覆盖

旧命令:

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

新命令

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

8

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

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

我已用robocopy替换了xcopy来解决受影响的发布后事件。robocopy似乎处理的路径略有不同,并且能够完成xcopy无法处理的复制任务。


5

这意味着

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

因此,基本上可以说是几乎所有的事情……尝试从命令提示符处一次运行一个命令,找出哪个命令给您带来麻烦。


3

我收到了这个消息

无效的驱动器规格

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

xcopy . \\localhost

哪里

xcopy . \\localhost\share

被期待


2

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

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

实际上,这是Visual Studio保持的东西。我刚刚重新启动了Visual Studio,它起作用了。


1

就我而言,问题是由于错误的构建顺序造成的。一个项目对生成后事件使用xcopy命令将文件从bin文件夹复制到另一个文件夹。但是由于不正确的依赖性,在进行xcopy的同时,在bin文件夹中创建了新文件。

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


1

此错误是由于是否有空白在其中复制了您的仓库。例如,将我的项目复制到下面的位置, c://projects/My rest project 那么您会看到那里的空白,如果将回购路径更改为下面的内容,则应该可以使用 c://projects/myrestproject


0

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

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

代替:

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

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"

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


0

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

在此处输入图片说明


0

如果在调试模式下还有其他解决方案,则先将其全部停止,然后重新启动Visual Studio。它为我工作。


0

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

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

这对我有用!

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.