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

Posted

技术标签:

【中文标题】为啥构建后步骤 (xcopy) 偶尔会在 TeamCity 构建中以代码 2 退出?【英文标题】:Why would a post-build step (xcopy) occasionally exit with code 2 in a TeamCity build?为什么构建后步骤 (xcopy) 偶尔会在 TeamCity 构建中以代码 2 退出? 【发布时间】:2011-12-11 17:27:38 【问题描述】:

我的客户解决方案中的一些项目有构建后事件:xcopy 构建输出到特定文件夹。这在本地构建时效果很好。但是,在 TeamCity 中,我偶尔会得到 ​​p>

xcopy [...] 以代码 2 退出

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

为什么这在 TeamCity 中失败了,而在本地却没有?

【问题讨论】:

我遇到了类似的问题,但与同时并行复制同一个文件有关。你能仔细检查一下没有文件被复制两次吗? 退出代码 2 表示The user pressed CTRL+C to terminate xcopy。呵呵。 @SoMoS 是的,被复制的文件肯定是不同的。 @HansPassant 我不知道为什么 teamcity 会想对我按 CTRL+C! :( 是的,我也没有。另一个常见约定是退出代码等于最后一个 Windows 错误或异常。错误 2 表示“找不到文件”。这当然更有意义。 【参考方案1】:

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

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

【讨论】:

如此简单! /Y 禁止提示!为什么这么难找? /Y 确实抑制了覆盖提示,但这不是代码 2 的唯一原因。RTFM 不会告诉您是什么导致了它们。【参考方案2】:

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

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

要说你正在复制的东西是一个文件,回显F

echo F|xcopy /y ...

要说你要复制的是一个目录,回显D:

echo D|xcopy /y ...

有时可以通过简单地使用复制命令而不是 xcopy 来解决上述问题:

copy /y ...

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

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

【讨论】:

感谢@Metro Smurf。我无法测试这是否能解决我的问题,但你说的听起来很聪明,所以我把它标记为答案。干杯! 我遇到了完全相同的问题,最终在响应中出现了管道。希望从长远来看,这将对其他人有所帮助。 "这在 Windows 的本地化版本下不起作用,提示词可能不同。另一种技巧是在目标末尾添加星号 '',然后 xcopy 获胜'不提示文件/目录。- Govert Jan 28 at 19:40" 因此,您可以在没有 echo D 的情况下进行这样的复制(这是不可靠的):XCOPY $(ProjectDir)..\scripts* $(TargetDir )脚本* /Y /R 。或者像这样复制没有 echo F: XCOPY D:\file.zip c:\renamedFile.zip /Y /R @leetNightshade - * 也适用于目录吗?或者这只是为了文件? @MetroSmurf 嗯,我的示例格式似乎失败了,缺少反斜杠(一定以为我试图转义符号)和缺少星号。但是,是的,它确实适用于目录和文件。这是 Govert 答案的链接:***.com/a/14022309/353094【参考方案3】:

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

【讨论】:

【参考方案4】:

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

【讨论】:

就是这样。在 Windows 7、Visual Studio 2013 上运行良好。非常感谢!【参考方案5】:

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

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

【讨论】:

【参考方案6】:

copy 为我修复了它。 xcopy with /c /y 没用。我正在退出 4,所以我选择了 xcopy,但结果我需要在 ($TargetPath) 周围加上引号。

我的脚本:

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

【讨论】:

以上是关于为啥构建后步骤 (xcopy) 偶尔会在 TeamCity 构建中以代码 2 退出?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Spring Social 插件偶尔会在 User 类上返回空邮件?

升级到 TensorRT 7 后加载或构建 cuda 引擎偶尔会崩溃

无法在 MS Team Foundation Server 2015 上创建 CxSAST 构建步骤

excel VBA窗体按钮控件设置enter事件后,为啥会在启动窗体时,自动enter一次?

如果指定目录不存在,XCOPY 切换创建指定目录?

为啥我的 iPhone 应用程序的发布版本在安装后第一次运行时会在设备上崩溃?