【问题标题】:capture cmd output捕获 cmd 输出
【发布时间】:2012-06-19 22:24:23
【问题描述】:

我们正在从 ccnet 转移到 teamcity,所以我的问题可能只是无知,但无论如何:

我有一个 cmd line hack 来检查“Todo”cmets 的构建并输出计数:

findstr /s /i "TODO" *.cs | find /c "":""

findstr /s /i TODO *.cs | find /c "":"" >todo.txt

现在,如果它大于 0,我想使构建失败,但我无法弄清楚如何做到这一点。 我相信如果我能将结果注入到构建日志中会是最好的

我该怎么做?

【问题讨论】:

    标签: cmd teamcity teamcity-7.0


    【解决方案1】:

    如果我正确理解您的要求,如果您在任何包含字符串 TODO 以及 ? (其他一些字符串)。

    我相信您的 FIND 命令已损坏。正如所写,它在名为: 的文件中查找一个空字符串。我相信您想搜索管道 FINDSTR 命令的输出。但我不明白您要使用 FIND 查找什么字符串。

    FIND 搜索字符串必须用双引号括起来 - "search"。如果搜索要包含双引号,则每个双引号必须用另一个双引号转义。要搜索She said "Hello",您需要"She said ""Hello"""

    我怀疑你使用 FIND 命令是因为你想要计数。但是由于您只是在寻找字符串的存在(计数> 0),因此您不需要实际计数。可以将输出重定向到 nul,如果找到字符串,可以使用 && 运算符执行操作。

    您应该能够使用正则表达式通过单个 FINDSTR 命令执行搜索。我将假设您正在寻找包含: 的任何行,然后在某个时间点后跟TODO(不区分大小写)。表达式 .* 匹配除换行符以外的任何字符 0 次或更多次。所以你的搜索字符串是:.*TODO。如果我弄错了:,并且您需要在搜索中包含一个双引号,那么每个双引号都需要使用像\" 这样的反斜杠进行转义。

    您正在所有子目录中执行不区分大小写的递归正则表达式搜索,因此您需要/s/r/i 选项。

    FINDSTR 将在每个空格处将任何字符串拆分为多个搜索,除非您使用/c: 选项。我认为您的搜索没有空格,但我喜欢以任何方式使用/c 选项。通常搜索字符串也用双引号括起来。

    完整的命令是

    >nul findstr /sri /c:":.*TODO" *.cs && echo Do something to make the build fail
    

    我的问题是我不了解 TeamCity,所以我不知道如何向 TeamCity 发出信号以中止构建。如果找到搜索字符串,我只是打印了一条消息,但显然需要采取其他一些措施。

    编辑以响应 cmets

    好的 - 根据您的评论,TeamCity 似乎用另一个双引号转义了双引号。所以在你原来的问题中实际执行的命令变成了

    findstr /s /i TODO *.cs | find /c ":" >todo.txt
    

    正如你所说,完全没问题。

    在这种情况下,我对使用单个 FINDSTR 的建议应该是完美的。由于您的搜索不需要空格,我们可以一起消除引号。如果 TeamCity 可以检查返回的错误代码并采取措施,那真的很简单。

    >nul findstr /sri :.*TODO *.cs
    

    如果找到该字符串,则错误代码将为 0,如果未找到,则为 1。

    如果您需要错误代码为 1 如果找到则为 0 如果未找到,则只需使用

    >nul findstr /sri :.*TOTO *.cs && (exit 1) || (exit 0)
    


    如果你真的想使用你原来的命令

    findstr /s /i "TODO" *.cs | >nul find /c "":""
    

    如果找到将返回错误代码 0,如果未找到则返回 1

    findstr /s /i "TODO" *.cs | >nul find /c "":"" && (exit 1) || (exit 0)
    

    如果找到则返回错误代码 1,如果未找到则返回 0

    【讨论】:

    • 回答第一部分:不,我没有发现 find 命令损坏,因为它在我的 cmd 窗口中工作 findstr 报告了一个包含待办事项的文件列表并查找计数有多少:有该列表因为它们都以“d:”开头 - 哦和双引号 : 是因为 teamcity 出于某种原因在调用 cmd 时删除了它们
    • 我的问题是我的脚本在目标 comp 上运行时返回 57 并且 cmd 然后以错误代码 0 结束,并且在构建日志中唯一记录的是错误代码
    • 哦,*.cs 确保 findstr 仅在 .cs 文件中查找,如果您的意思是这样的话?
    【解决方案2】:

    事实证明,问题不是我的 cmdline,而是我从 teamcity 调用它的方式。您的输入 dbenham 仍然非常有用,因为我可能会根据您的建议使构建失败并且仍然显示违规行的数量。

    非常感谢:)

    正确用法如下图!

    【讨论】:

      猜你喜欢
      • 2013-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-03
      • 2019-02-23
      • 2014-07-26
      • 1970-01-01
      相关资源
      最近更新 更多