Я задокументировал многие противоречивые функции и ошибки 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, и оно находит число.
Аналогично, якорь \<
word 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
>