我们正在从ccnet转移到teamcity所以我的问题可能只是无知但无论如何:
我有一个cmd line hack来检查" Todo"评论并输出计数:
findstr /s /i "TODO" *.cs | find /c "":""
或
findstr /s /i TODO *.cs | find /c "":"" >todo.txt
现在我想要在构建时失败,如果它大于0但我无法弄清楚如何做到这一点。 我相信如果我可以将结果注入buildlog
,那将是最好的我该怎么做?
答案 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是非常有用的,因为我可能会失败你的建议的构建,仍然显示违规行数。
很有责任:)
正确的用法如下所示!