为啥构建后步骤 (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 构建步骤