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


93

我客户解决方案中的一些项目有一个生成后事件:xcopy生成输出到特定文件夹。在本地构建时,此方法工作正常。但是,在TeamCity中,我偶尔会得到

xcopy [...]退出,代码为2

如果我使用normal copy,它将以代码1退出。我希望这与文件锁定有关,尽管要复制的特定文件并不相同,因此可能只是锁定共享目标目录。我/y过去常常不提示覆盖文件。

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


我有类似的问题,但与同时并行复制同一文件有关。您能否再次检查没有文件被复制两次?
Ignacio Soler Garcia,

4
退出代码2表示The user pressed CTRL+C to terminate xcopy。呵呵。
汉斯·帕桑

@SoMoS是的,要复制的文件肯定是不同的。
蒂姆·艾尔斯

@HansPassant我不知道为什么teamcity要对我按CTRL + C!:(
蒂姆·艾尔斯

5
是的,我也不是。另一个常见约定是退出代码等于最后一个Windows错误或异常。错误2表示“找不到文件”。当然,这更有意义。
汉斯·帕桑

Answers:


146

即使为/Y交换机提供了xcopy,当xcopy不知道您要复制的内容是文件还是目录时,您仍然会收到错误消息。该错误将显示为“代码2退出”。当在命令提示符下运行相同的xcopy时,您会看到xcopy正在请求文件或目录的响应。

要使用自动构建解决此问题,您可以使用管道在预定义响应中回显。

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

echo F|xcopy /y ...

要说您要复制的内容是一个目录,请在中回显D

echo D|xcopy /y ...

有时上述问题可以通过使用copy命令而不是xcopy来解决:

copy /y ...

但是,如果有不存在的目录通向最终文件目的地,则将发生“以代码1退出”。

切记:请/C谨慎使用开关和xcopy。


谢谢@Metro Smurf。我无法测试这是否可以解决我的问题,但是您所说的听起来很聪明,因此我将其标记为答案。干杯!
蒂姆·艾尔斯

我遇到了完全相同的问题,最终以响应的方式结束。希望这将从长远来看会帮助其他人。
蓝精灵都会(Metro Smurf)

1
“这在本地化的Windows版本中不起作用,其中提示词可能有所不同。另一种技巧是在目标末尾添加星号' ',然后xcopy不会提示输入文件/目录。– Govert Jan 28 at 19:40“,因此,您可以像这样进行复制而无需回显D(这是不可靠的):XCOPY $(ProjectDir).. \ scripts * $(TargetDir)scripts * / Y / R。或执行不执行回声F的副本:XCOPY D:\ file.zip c:\ renamedFile.zip / Y / R
leetNightshade 2013年

@leetNightshade- *目录也可以使用吗?还是仅用于文件?
大都会蓝精灵

@MetroSmurf Hm,看来我的示例格式失败,缺少反斜杠(必须以为我正在尝试逃避符号)和缺少星号。但是可以,它确实适用于目录和文件。这是Govert答案的链接:stackoverflow.com/a/14022309/353094
leetNightshade 2013年

37

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


3
而已。在Windows 7,Visual Studio 2013上运行正常。非常感谢!
查尔斯

33

如果在后期构建事件中使用xcopy,则除了/ C之外,还使用/ Y开关。

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

4
很简单!/Y抑制提示!为什么这么难找到?
SouthShoreAK 2012年

3
/ Y确实抑制了覆盖提示,但这不是代码2的唯一原因。RTFM不会告诉您是什么原因导致它们。
MSalters 2013年

2

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


2

copy为我修复它。xcopy with /c /y不工作。我到了4号出口,所以我去了xcopy,但是原来我需要报价($TargetPath)

我的剧本:

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

2

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

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

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.