如果我正确理解您的要求,如果您在任何包含字符串 TODO 的 .cs 文件中找到至少一行以及?(其他一些字符串)。
我相信您的 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 发出信号以中止构建。如果找到搜索字符串,我只是打印了一条消息,但显然需要采取其他一些措施。
编辑以回应评论
好的 - 根据您的评论,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