Cmd 捕获命令输出

Cmd 捕获命令输出,cmd,teamcity,teamcity-7.0,Cmd,Teamcity,Teamcity 7.0,我们正在从ccnet迁移到teamcity,因此我的问题可能只是无知,但无论如何: 我有一个命令行hack,它检查构建中的“Todo”注释并输出计数: findstr /s /i "TODO" *.cs | find /c "":"" 或 现在,如果构建大于0,我希望它失败,但我很难弄清楚如何做到这一点。 我相信如果我能将结果注入到构建日志中,那将是最整洁的 如何做到这一点?如果我正确理解您的需求,那么如果您在任何.cs文件中发现至少有一行包含字符串TODO以及TODO,那么您就是在寻找“构建

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

我有一个命令行hack,它检查构建中的“Todo”注释并输出计数:

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

现在,如果构建大于0,我希望它失败,但我很难弄清楚如何做到这一点。 我相信如果我能将结果注入到构建日志中,那将是最整洁的


如何做到这一点?

如果我正确理解您的需求,那么如果您在任何.cs文件中发现至少有一行包含字符串TODO以及TODO,那么您就是在寻找“构建失败”?(其他一些字符串)

我相信你的搜寻命令被破坏了。写入时,它在名为
的文件中查找空字符串。我相信您希望搜索管道FINDSTR命令的输出。但我不明白你想用FIND找什么字符串

查找搜索字符串必须用双引号括起来-
“搜索”
。如果搜索包含双引号,则每个双引号必须用另一个双引号转义。要搜索
她说“你好”
,您需要
“她说“你好”

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

您应该能够使用正则表达式使用单个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。事实证明,问题出在我的cmdline上,而是我从teamcity调用它的方式。但是,您的输入dbenham非常有用,因为我可以根据您的建议使生成失败,并且仍然显示有问题的行数

非常感谢:)

正确的用法如下所示


回答第一部分:否,我没有发现find命令被破坏,因为它在我的cmd窗口中工作findstr报告了一个包含todo的文件列表,并计算了数量:该列表中有,因为它们都以“d:"-oh和双引号:是因为teamcity在调用cmd时出于某种原因删除了它们。我的问题是,我的脚本在目标comp上运行时返回57和cmd,然后以错误代码0结束,在构建日志中记录的唯一内容是错误代码oh和*.cs确保findstr只查找.cs文件,如果这是什么你是说和我一起?
findstr /s /i "TODO" *.cs | >nul find /c "":"" && (exit 1) || (exit 0)