为什么在TeamCity构建中,构建后步骤(xcopy)偶尔会以代码2退出?

为什么在TeamCity构建中,构建后步骤(xcopy)偶尔会以代码2退出?,teamcity,xcopy,Teamcity,Xcopy,我的客户解决方案中的一些项目具有生成后事件:xcopy将生成输出复制到特定文件夹。这在本地构建时效果很好。然而,在TeamCity,我偶尔会 xcopy[…]已退出,代码为2 如果我使用常规的copy,它将以代码1退出。我认为这与文件锁定有关,尽管复制的特定文件不同,所以可能只是锁定共享目标目录。我使用/y不提示覆盖文件 为什么在TeamCity中失败,但在本地失败?如果在生成后事件中使用xcopy,除了使用/C外,还使用/Y开关 /C Continues copying e

我的客户解决方案中的一些项目具有生成后事件:
xcopy
将生成输出复制到特定文件夹。这在本地构建时效果很好。然而,在TeamCity,我偶尔会

xcopy[…]已退出,代码为2

如果我使用常规的
copy
,它将以代码1退出。我认为这与文件锁定有关,尽管复制的特定文件不同,所以可能只是锁定共享目标目录。我使用
/y
不提示覆盖文件


为什么在TeamCity中失败,但在本地失败?

如果在生成后事件中使用xcopy,除了使用/C外,还使用/Y开关

/C           Continues copying even if errors occur.
/Y           Suppresses prompting to confirm you want to overwrite an existing file.

即使您为xcopy提供了
/Y
开关,当xcopy不知道您要复制的是文件还是目录时,仍然会出现错误。此错误将显示为“已退出,代码为2”。当您在命令提示符下运行同一个xcopy时,您将看到xcopy请求文件或目录的响应

要通过自动生成解决此问题,您可以使用管道在预定义响应中回送

要说您正在复制的是一个文件,请在
F
中回显:

echo F|xcopy /y ...
要说您正在复制的东西是一个目录,请在
D
中回显:

echo D|xcopy /y ...
有时,只需使用copy命令而不是xcopy即可解决上述问题:

copy /y ...
但是,如果指向最终文件目标的目录不存在,则会出现“退出,代码为1”


请记住:小心使用
/C
开关和xcopy。

我解决此问题的方法是进入目标bin文件夹,并确保其中存在正确的子文件夹。手动创建该子文件夹后,构建过程将成功完成。

我通过在路径末尾添加\来修复错误代码2,如果没有\的话,xcopy会认为它是一个文件而不是文件夹。

您可能正在使用带有git的TeamCity。如果是,请检查git存储库中是否存在要复制的文件夹。通常,git不会将空项目文件夹添加到存储库中,因此
xcopy
无法找到它并生成错误


您可以将一些空文本文件添加到空文件夹中,提交并查看存储库中出现的文件夹。

copy
为我修复了它<代码>带/c/y的xcopy不起作用。我得到了一个出口4,所以我选择了
xcopy
,但结果是我需要
($TargetPath)
周围的引号

我的剧本:

if $(ConfigurationName) == Debug copy "$(TargetPath)" "$(SolutionDir)\Folder\bin\Debug\$(TargetFileName)"

我也有类似的问题,但与同时并行复制同一个文件有关。您能再次检查两次是否没有复制任何文件吗?退出代码2表示
用户按CTRL+C终止xcopy
。呵呵。@SoMoS是的,被复制的文件绝对是不同的。@HansPassant我不知道teamcity为什么要对我按CTRL+C!:(是的,我也是。另一个常见的约定是退出代码等于最后一个Windows错误或异常。错误2表示“找不到文件”。这当然更有意义。太简单了!
/Y
抑制了提示!为什么这么难找到?/Y确实抑制了覆盖提示,但这不是代码2的唯一原因。RTFM不会告诉你是什么原因造成的。谢谢@Metro Smurf。我无法测试这是否解决了我的问题,但你怎么说unds很聪明,所以我把它标记为答案。干杯!我遇到了完全相同的问题,最终在回答中出现了管道。希望从长远来看这能帮助其他人。“这在本地化版本的Windows下不起作用,其中提示词可能不同。另一个技巧是在目标的末尾添加星号“”,然后xcopy将不会提示输入文件/目录。-Govert Jan 28日19:40”因此,您可以在没有echo D的情况下这样做(这不可靠):xcopy$(ProjectDir)..\scripts*$(TargetDir)scripts*/Y/R。或者在不使用echo的情况下执行这样的复制F:XCOPY D:\file.zip c:\renamedFile.zip/Y/R@leetNightshade-
*
是否也适用于目录?还是仅适用于文件?@MetroSmurf Hm,我的示例的格式设置似乎失败,缺少反斜杠(一定以为我是在逃避符号)和缺少星号。但是,是的,它确实适用于目录和文件。下面是指向Govert答案的链接:就是这样。在Windows 7、Visual Studio 2013上运行良好。非常感谢!