【问题标题】: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 表示“找不到文件”。这当然更有意义。

标签: teamcity xcopy


【解决方案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 答案的链接:stackoverflow.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)"
      

      【讨论】:

        猜你喜欢
        • 2010-12-31
        • 1970-01-01
        • 2015-12-12
        • 2017-01-24
        • 1970-01-01
        • 1970-01-01
        • 2020-06-08
        • 2014-09-13
        • 1970-01-01
        相关资源
        最近更新 更多