我已经在Windows FINDSTR命令的未记录功能和局限性中记录了许多令人困惑的FINDSTR功能和错误。
您的代码中有两个导致失败的问题。
1)FINDSTR正则表达式最多可使用15个[class]术语
您的搜索有16个,因此它不起作用。但是您的第一个术语是[2]
,可以简化为2
。因此,以下应该工作:
findstr /rb /s "2[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]\>" "%userprofile%\*.txt" >>output.txt
但事实并非如此,
>echo 2123456789123456|findstr /rb "2[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]\>"
>
什么也不返回。
我相信这会暴露以前未知的错误或“功能”:-/
我没有时间进行彻底调查,但是建议的错误/功能是:
2)起始词锚\<
和结束词锚\>
都计入[class]
术语限制15。如果搜索包括其中一个锚,并且累积术语计数正好为16,则搜索可能会静默失败(建议的新错误报告-在Win 10上进行了部分测试只要)
的\>
端锚字的一个非字字符或线的端部,或输入的结束之前应匹配点。但是在上面的测试用例中,有15个类术语,再加上一个单词锚点末尾,总共16个,这会静默失败。
如果我将测试更改为:
>echo 2123456789123456|findstr /rb "21[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]\>"
2123456789123456
>
然后,总数为15,并找到该数字。
同样,\<
单词begin锚应该与输入的开始,行的开头或紧接在“非单词”字符之后的位置匹配。
但是下面的测试的累计期限计数为16,这也默默地失败了:
>echo 2123456789123456|findstr /r "\<2[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]"
>
如果我删除其中一个类别术语,则计数为15,并且成功:
>echo 2123456789123456|findstr /r "\<21[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]"
2123456789123456
>
如果我在15个类别词中都包含两个锚,则总数为17,而我得到了FINDSTR: Search string too long.
错误。
>echo 2123456789123456|findstr /r "\<2[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]\>"
FINDSTR: Search string too long.
>
如果我删除一个班级学期,则总学期数为16,并且它默默地失败:
>echo 2123456789123456|findstr /r "\<21[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]\>"
>
如果我删除另一个班级学期,则总学期数为15,并且可以正常工作
>echo 2123456789123456|findstr /r "\<212[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]\>"
2123456789123456
>