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
此代码的目的是在 %userprofile% 中搜索一个字符串,该字符串长度为 16 个数字,以数字 2 开头,然后将其写入 output.txt
在桌面上,我创建了一个名为 test.txt 的文件,其中包含以下数字,没有其他内容:2123456789123456
包含 findstr 命令的程序位于 %userprofile% 目录中。
但是,当我运行该程序时,output.txt 文件变为空白。
编辑:有人知道错误可能出在哪里吗?
答案1
我记录了许多令人困惑的 FINDSTR 功能和错误Windows 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,它会找到数字。
类似地,\<
单词开始锚点应该与输入的开头、行的开头或“非单词”字符之后的紧接着的位置相匹配。
但是下面的测试累计术语数为 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
>
答案2
当我运行该程序时,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]\>"
FINDSTR: Search string too long.
> echo 2123456789123456 | findstr /rb "[2][0-9]*\>"
2123456789123456