捕获cmd输出

时间:2012-06-19 08:33:31

标签: cmd teamcity teamcity-7.0

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

我有一个cmd line hack来检查" Todo"评论并输出计数:

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

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

现在我想要在构建时失败,如果它大于0但我无法弄清楚如何做到这一点。 我相信如果我可以将结果注入buildlog

,那将是最好的

我该怎么做?

2 个答案:

答案 0 :(得分:1)

如果我正确理解您的要求,如果您在.cs文件中找到包含字符串TODO的至少一行,那么您希望“构建失败”? (其他一些字符串)。

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

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

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

您应该能够使用正则表达式使用单个FINDSTR命令执行搜索。我将假设您正在查找包含:的任何行,其后跟TODO(不区分大小写)。表达式.*匹配除换行符0之外的任何字符或更多次。因此,您的搜索字符串为:.*TODO。如果我得到:错误,并且您需要在搜索中包含双引号,那么每个双引号都需要使用\"之类的反斜杠进行转义。

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

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

完整的命令是

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

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

编辑以回应评论

好的 - 根据您的评论,看起来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

答案 1 :(得分:0)

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

很有责任:)

正确的用法如下所示!

picture of buildstep in teamcity with the command line properly setup