如果我正确理解您的要求,如果您在任何包含字符串 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