1
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 выходит пустым.

РЕДАКТИРОВАТЬ: кто-то есть идея относительно того, где может быть ошибка?

2 ответа2

2

Я задокументировал многие противоречивые функции и ошибки 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

>
1

Когда я запускаю программу, файл 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

Дальнейшее чтение

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .