Команда Windows FINDSTR ужасно задокументирована. Существует очень простая справка по командной строке, доступная через FINDSTR /?
или HELP FINDSTR
, но она крайне неадекватна. На сайте https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/findstr можно найти немного больше документации .
Существует множество функций и ограничений FINDSTR, которые даже не упоминаются в документации. Также их нельзя было ожидать без предварительного знания и / или тщательного экспериментирования.
Итак, вопрос в том, каковы недокументированные особенности и ограничения FINDSTR?
Цель этого вопроса - предоставить единый репозиторий многих недокументированных функций, чтобы:
А) Разработчики могут в полной мере воспользоваться функциями, которые там есть.
Б) Разработчики не тратят свое время на размышления о том, почему что-то не работает, когда кажется, что должно.
Пожалуйста, убедитесь, что вы знаете существующую документацию, прежде чем ответить. Если информация покрыта ПОМОЩЬЮ, то она здесь не принадлежит.
Также это не место, чтобы показать интересные применения FINDSTR. Если логический человек может предвидеть поведение конкретного использования FINDSTR на основе документации, то он не относится к этому.
В том же духе, если логический человек мог предвидеть поведение конкретного использования на основе информации, содержащейся в любых существующих ответах, то, опять же, он здесь не принадлежит.
источник
grep
которых является очень хорошо поняло и документированный :-) См stackoverflow.com/questions/2635740/... , например.Ответы:
Предисловие
Большая часть информации в этом ответе была собрана на основе экспериментов, проведенных на компьютере с Vista. Если прямо не указано иное, я не подтвердил, применима ли информация к другим версиям Windows.
Вывод FINDSTR
Документация никогда не объясняет вывод FINDSTR. Это намекает на то, что печатаются совпадающие строки, но не более того.
Формат соответствия строки выводится следующим образом:
Имя файла: LINENUMBER: lineOffset: текст
где
fileName: = Имя файла, содержащего совпадающую строку. Имя файла не печатается, если запрос был явно для одного файла, или при поиске вводимых по трубопроводу входов или перенаправленных входных данных. При печати fileName всегда будет содержать любую предоставленную информацию о пути. Дополнительная информация о пути будет добавлена, если используется эта
/S
опция. Печатный путь всегда указывается относительно предоставленного пути или относительно текущего каталога, если он не указан.Примечание. Префикса имени файла можно избежать при поиске в нескольких файлах с использованием нестандартных (и плохо документированных) подстановочных знаков
<
и>
. Точные правила работы этих подстановочных знаков можно найти здесь . Наконец, вы можете посмотреть на этот пример того, как нестандартные символы подстановки работают с FINDSTR .lineNumber: = Номер строки совпадающей строки, представленной в виде десятичного значения, где 1 представляет 1-ю строку ввода. Распечатывается, только если
/N
указана опция.lineOffset: = десятичное смещение байта начала совпадающей строки, где 0 представляет 1-й символ 1-й строки. Распечатывается, только если
/O
указана опция. Это не смещение совпадения в строке. Это число байтов от начала файла до начала строки.text = двоичное представление совпадающей строки, включая любые <CR> и / или <LF>. Ничего не осталось из двоичного вывода, так что этот пример, который соответствует всем строкам, даст точную двоичную копию исходного файла.
Параметр / A задает цвет только для fileName :, lineNumber: и lineOffset: output. Текст соответствующей строки всегда выводится с текущим цветом консоли. Параметр / A действует только тогда, когда вывод отображается непосредственно на консоли. Параметр / A не действует, если выходные данные перенаправляются в файл или передаются по конвейеру. Смотрите описание 2018-08-18 в ответе Aacini для описания ошибочного поведения при перенаправлении вывода в CON.
Большинство контрольных символов и многие расширенные символы ASCII отображаются в виде точек в XP.
FINDSTR в XP отображает большинство непечатаемых контрольных символов из соответствующих строк в виде точек (точек) на экране. Следующие управляющие символы являются исключениями; они отображаются как сами: вкладка 0x09, перевод строки 0x0A, вертикальная вкладка 0x0B, подача формы 0x0C, возврат каретки 0x0D.
XP FINDSTR также преобразует ряд расширенных символов ASCII в точки. Расширенные символы ASCII, которые отображаются как точки в XP, такие же, как те, которые преобразуются при вводе в командной строке. См. Раздел «Ограничения символов для параметров командной строки - Расширенное преобразование ASCII» , далее в этом посте.
Управляющие символы и расширенный ASCII не преобразуются в точки в XP, если выходные данные передаются по конвейеру, перенаправляются в файл или в предложении FOR IN ().
Vista и Windows 7 всегда отображают все символы как сами по себе, а не как точки.
Коды возврата (ОШИБКА)
/A:xx
опции/L
и/R
оба указанных/A:
,/F:
,/C:
,/D:
, или/G:
/F:file
или/G:file
не найденсм. Предел термина класса символов Regex и сообщение об ошибке во второй части ответа.
Источник данных для поиска (Обновлено на основе тестов с Windows 7)
Findstr может искать данные только из одного из следующих источников:
имена файлов, указанные в качестве аргументов и / или с помощью
/F:file
опции.стандартный ввод через перенаправление
findstr "searchString" <file
поток данных из трубы
type file | findstr "searchString"
Аргументы / опции имеют приоритет над перенаправлением, которое имеет приоритет над переданными данными.
Аргументы имени файла и
/F:file
могут быть объединены. Можно использовать несколько аргументов имени файла. Если/F:file
указано несколько параметров, используется только последний. Подстановочные знаки допускаются в аргументах имени файла, но не в пределах файла, на который указывает/F:file
.Источник строк поиска (обновляется на основе тестов с Windows 7) и опции могут быть объединены. Можно указать несколько параметров. Если указано несколько параметров, используется только последний. Если какая- либо или используется, то все аргументы , не вариант предполагаются файлы для поиска. Если ни то, ни другое не используется, то первый неопциональный аргумент обрабатывается как список поисковых терминов, разделенных пробелом.
/G:file
/C:string
/C:string
/G:file
/G:file
/C:string
/G:file
/C:string
Имена файлов не должны заключаться в кавычки внутри файла при использовании
/F:FILE
опции.Имена файлов могут содержать пробелы и другие специальные символы. Большинство команд требуют, чтобы такие имена файлов были заключены в кавычки. Но
/F:files.txt
опция FINDSTR требует, чтобы имена файлов в файле files.txt НЕ цитировались. Файл не будет найден, если имя указано в кавычках.BUG - Short 8.3 имена файлов могут сломать
/D
и/S
параметрыКак и со всеми командами Windows, FINDSTR будет пытаться соответствовать как длинное имя и краткое 8.3 имя при поиске файлов для поиска. Предположим, что текущая папка содержит следующие непустые файлы:
Следующая команда успешно найдет все 3 файла:
b.txt2
совпадает, потому что соответствующее короткое имяB9F64~1.TXT
совпадает. Это согласуется с поведением всех других команд Windows.Но ошибка с
/D
и/S
опциями вызывает следующие команды лишь найтиb1.txt
Ошибка не может
b.txt2
быть найдена, как и все имена файлов, которые сортируютсяb.txt2
в одном и том же каталоге. Дополнительные файлы, которые сортируют, какa.txt
, например , найдены. Дополнительные файлы, которые сортируются позже, напримерd.txt
, пропускаются после того, как ошибка была вызвана.Каждый найденный каталог обрабатывается независимо. Например, эта
/S
опция будет успешно начинать поиск в дочерней папке после невозможности найти файлы в родительской папке, но как только ошибка приведет к тому, что короткое имя файла будет пропущено в дочерней папке, тогда все последующие файлы в этой дочерней папке также будут пропущены. ,Команды работают без ошибок, если на компьютере с отключенной генерацией имен NTFS 8.3 созданы одинаковые имена файлов. Конечно
b.txt2
, не будет найден, ноc.txt
будет найден правильно.Не все короткие имена вызывают ошибку. Все случаи ошибочного поведения, которые я видел, включают расширение длиной более 3 символов с коротким 8.3 именем, которое начинается так же, как и обычное имя, которое не требует имени 8.3.
Ошибка была подтверждена на XP, Vista и Windows 7.
Непечатаемые символы и
/P
вариант опция заставляет FINDSTR пропустить какой - либо файл , который содержит любой из следующих кодов байт десятичных: 0-7, 14-25, 27-31./P
Другими словами,
/P
опция будет пропускать только те файлы, которые содержат непечатные управляющие символы. Управляющие символы - это коды, которые меньше или равны 31 (0x1F). FINDSTR рассматривает следующие управляющие символы как печатные:Все остальные управляющие символы обрабатываются как непечатные, наличие которых приводит к
/P
возможности пропустить файл.Вводные данные с перенаправленным вводом могут быть
<CR><LF>
добавлены.Если входные данные переданы по конвейеру, а последний символ потока отсутствует
<LF>
, FINDSTR автоматически добавится<CR><LF>
к входным данным. Это было подтверждено в XP, Vista и Windows 7. (Раньше я думал, что канал Windows был ответственен за изменение ввода, но с тех пор я обнаружил, что FINDSTR фактически делает изменение.)То же самое верно для перенаправленного ввода в Vista. Если последний символ файла, используемого в качестве перенаправленного ввода, не является
<LF>
, FINDSTR автоматически добавится<CR><LF>
к вводу. Однако XP и Windows 7 не изменяют перенаправленный ввод.FINDSTR зависает в XP и Windows 7, если перенаправленный ввод не заканчивается.
<LF>
Это неприятная «особенность» в XP и Windows 7. Если последний символ файла, используемого в качестве перенаправленного ввода, не заканчивается
<LF>
, FINDSTR будет зависать бесконечно, как только он достигает конца перенаправленного файла.Последняя строка данных Piped может игнорироваться, если она состоит из одного символа.
Если ввод передается по конвейеру, а последняя строка состоит из одного символа, за которым не следует
<LF>
, то FINDSTR полностью игнорирует последнюю строку.Пример - первая команда с одним символом и без
<LF>
совпадения, но вторая команда с 2 символами работает нормально, как и третья команда с одним символом с завершающим символом новой строки.Об этом сообщает пользователь DosTips Sponge Belly на новой ошибке findstr . Подтверждено на XP, Windows 7 и Windows 8. Еще не слышал о Vista. (У меня больше нет Vista для тестирования).
Синтаксис
опций Опция может иметь префикс либо либо,
/
либо-
опции могут объединяться после одного/
или-
. Однако объединенный список параметров может содержать не более одного параметра с несколькими символами, например OFF или F:, и параметр из нескольких символов должен быть последним параметром в списке.Ниже приведены все эквивалентные способы выражения регистрозависимого поиска без учета регистра для любой строки, которая содержит слова «привет» и «до свидания» в любом порядке.
/i /r /c:"hello.*goodbye" /c:"goodbye.*hello"
-i -r -c:"hello.*goodbye" /c:"goodbye.*hello"
/irc:"hello.*goodbye" /c:"goodbye.*hello"
Ограничения длины строки поиска
В Vista максимально допустимая длина одной строки поиска составляет 511 байт. Если какая-либо строка поиска превышает 511, то результатом будет
FINDSTR: Search string too long.
ошибка ERRORLEVEL 2.При выполнении поиска по регулярному выражению максимальная длина строки поиска равна 254. Регулярное выражение с длиной от 255 до 511 приведет к
FINDSTR: Out of memory
ошибке с ошибкой 2. Длина регулярного выражения> 511 приведет кFINDSTR: Search string too long.
ошибке.В Windows XP длина строки поиска явно меньше. Ошибка Findstr: «Слишком длинная строка поиска»: как извлечь и сопоставить подстроку в цикле «for»? Ограничение XP составляет 127 байтов для литерального и регулярного поиска.
Ограничения длины строки
Файлы, указанные в качестве аргумента командной строки или с помощью параметра / F: FILE, не имеют известного ограничения длины строки. Поиск был успешно выполнен для файла размером 128 МБ, который не содержал ни одного <LF>.
Данные по конвейеру и перенаправленный ввод ограничены 8191 байтами на строку. Этот лимит является «особенностью» FINDSTR. Это не присуще трубам или перенаправлению. FINDSTR, использующий перенаправленный ввод stdin или piped, никогда не будет соответствовать ни одной строке размером> = 8 Кбайт. Строки> = 8k генерируют сообщение об ошибке для stderr, но значение ERRORLEVEL равно 0, если строка поиска найдена хотя бы в одной строке хотя бы одного файла.
Тип поиска по умолчанию: Литерал против Регулярного выражения
/C:"string"
- по умолчанию это / L литерал. Явное объединение параметра / L с / C: «строка», безусловно, работает, но является избыточным."string argument"
- Значение по умолчанию зависит от содержимого самой первой строки поиска. (Помните, что <пробел> используется для разделения строк поиска.) Если первая строка поиска является допустимым регулярным выражением, которое содержит хотя бы один неэкранированный метасимвол, то все строки поиска обрабатываются как регулярные выражения. В противном случае все строки поиска рассматриваются как литералы. Например,"51.4 200"
будет обрабатываться как два регулярных выражения, поскольку первая строка содержит неэкранированную точку, тогда как"200 51.4"
будет рассматриваться как два литерала, поскольку первая строка не содержит метасимволов./G:file
- Значение по умолчанию зависит от содержимого первой непустой строки в файле. Если первая строка поиска является допустимым регулярным выражением, которое содержит хотя бы один неэкранированный метасимвол, то все строки поиска обрабатываются как регулярные выражения. В противном случае все строки поиска рассматриваются как литералы.Рекомендация - всегда явно указывайте
/L
опцию литерала или опцию/R
регулярного выражения при использовании"string argument"
или/G:file
.ОШИБКА - Задание нескольких литеральных строк поиска может дать ненадежные результаты
В следующем простом примере FINDSTR не удается найти совпадение, даже если оно должно.
Эта ошибка была подтверждена в Windows Server 2003, Windows XP, Vista и Windows 7.
Основываясь на экспериментах, FINDSTR может потерпеть неудачу, если выполнены все следующие условия:
/I
опции)При каждом сбое, которое я видел, всегда происходит сбой одной из коротких строк поиска.
Для получения дополнительной информации см. Почему этот пример FINDSTR с несколькими литеральными строками поиска не находит соответствия?
Экранирование
кавычек и обратной косой черты в литеральных строках поиска / G: FILE Автономные кавычки и обратные косые черты в файле литеральных строк поиска, указанных в / G: file, не нужно экранировать, но они могут быть.
"
и\"
эквивалентны.\
и\\
эквивалентны.Если цель состоит в том, чтобы найти \\, то, по крайней мере, должен быть экранирован ведущий обратный слеш. Оба
\\\
и\\\\
работают.Если цель состоит в том, чтобы найти \ ", то, по крайней мере, должен быть экранирован ведущий обратный слеш. И то
\\"
и другое\\\"
работает.Экранирование кавычек и обратной косой черты в / G: строки поиска по регулярному выражению FILE
Это единственный случай, когда escape-последовательности работают, как и ожидалось, основываясь на документации. Цитата не является метасимволом регулярных выражений, поэтому ее не нужно экранировать (но можно). Обратная косая черта является метасимволом регулярных выражений, поэтому ее необходимо экранировать.
Пределы символов для параметров командной строки - Расширенное преобразование ASCII
Нулевой символ (0x00) не может появляться ни в одной строке командной строки. Любой другой однобайтовый символ может появиться в строке (0x01 - 0xFF). Однако FINDSTR преобразует многие расширенные символы ASCII, которые он находит в параметрах командной строки, в другие символы. Это оказывает серьезное влияние двумя способами:
1) Многие расширенные символы ASCII не будут совпадать, если они используются в качестве строки поиска в командной строке. Это ограничение одинаково для литеральных и регулярных поисков. Если строка поиска должна содержать расширенный ASCII, тогда
/G:FILE
следует использовать эту опцию.2) FINDSTR может не найти файл, если имя содержит расширенные символы ASCII и имя файла указано в командной строке. Если файл для поиска содержит расширенный ASCII в имени, тогда
/F:FILE
вместо этого следует использовать эту опцию.Вот полный список расширенных преобразований символов ASCII, которые FINDSTR выполняет в строках командной строки. Каждый символ представлен в виде десятичного значения байтового кода. Первый код представляет символ, указанный в командной строке, а второй код представляет символ, в который он преобразован. Обратите внимание - этот список был составлен на американском компьютере. Я не знаю, какое влияние на этот список могут оказать другие языки.
Любой символ> 0, отсутствующий в приведенном выше списке, рассматривается как сам по себе, включая
<CR>
и <LF>
. Самый простой способ включить нечетные символы, такие как<CR>
и,<LF>
- это поместить их в переменную окружения и использовать отложенное расширение в аргументе командной строки.Пределы символов для строк, найденных в файлах, указанных в параметрах / G: FILE и / F: FILE
Символ nul (0x00) может появляться в файле, но он действует как терминатор строки C. Любые символы после нулевого символа обрабатываются как другая строка, как если бы они были в другой строке.
<CR>
И<LF>
символы рассматриваются как линейные терминаторы , которые завершаются строки, и не включаются в строку.Все остальные однобайтовые символы полностью включены в строку.
Поиск файлов Unicode
FINDSTR не может правильно искать большинство Unicode (UTF-16, UTF-16LE, UTF-16BE, UTF-32), потому что он не может искать нулевые байты, а Unicode обычно содержит много нулевых байтов.
Однако команда TYPE преобразует UTF-16LE с BOM в однобайтовый набор символов, поэтому такая команда будет работать с UTF-16LE с BOM.
Обратите внимание, что кодовые точки Unicode, которые не поддерживаются вашей активной кодовой страницей, будут преобразованы в
?
символы.Поиск в UTF-8 возможен, если строка поиска содержит только ASCII. Однако вывод на консоль любых многобайтовых символов UTF-8 будет неправильным. Но если вы перенаправите вывод в файл, то результат будет правильно закодирован UTF-8. Обратите внимание, что если файл UTF-8 содержит спецификацию, то эта спецификация будет рассматриваться как часть первой строки, что может привести к сбою в поиске, который соответствует началу строки.
Можно искать многобайтовые символы UTF-8, если поместить строку поиска в файл поиска в кодировке UTF-8 (без спецификации) и использовать параметр / G.
Конец строки
FINDSTR разрывает строки сразу после каждого <LF>. Наличие или отсутствие <CR> не влияет на разрывы строк.
Поиск через разрывы строк
Как и ожидалось,
.
метасимвол регулярного выражения не будет совпадать с <CR> или <LF>. Но можно искать через разрыв строки, используя строку поиска командной строки. Символы <CR> и <LF> должны совпадать явно. Если найдено многострочное совпадение, печатается только 1-я строка совпадения. Затем FINDSTR удваивается до 2-ой строки в источнике и снова начинает поиск - что-то вроде функции «смотреть вперед».Предположим, что TEXT.TXT содержит это содержимое (может быть в стиле Unix или Windows)
Тогда этот скрипт
дает эти результаты
Поиск по разрывам строк с использованием параметра / G: FILE является неточным, поскольку единственный способ сопоставить <CR> или <LF> - это выражение диапазона классов символов регулярного выражения, которое помещает символы EOL в сэндвич.
[<TAB>-<0x0B>]
соответствует <LF>, но также соответствует <TAB> и <0x0B>[<0x0C>-!]
соответствует <CR>, но также соответствует <0x0C> и!Обратите внимание - выше приведены символические представления потока байтов регулярных выражений, поскольку я не могу графически представить символы.
Ответ продолжен в части 2 ниже ...
источник
addpath.bat
из Q141344 и findstr, которая может быть связана с проблемой зависания Win7, упомянутой выше. Я создал чат, чтобы попытаться отследить это, для всех, кому интересно: chat.stackoverflow.com/rooms/13177/…/S
и/D
опции, вытекающие из коротких 8.3 имен файлов.<LF>
Продолжение ответа с части 1 выше - я столкнулся с лимитом 30 000 символов :-(
Ограниченные регулярные выражения (регулярное выражение) Поддержка
FINDSTR для регулярных выражений крайне ограничена. Если его нет в документации HELP, он не поддерживается.
Кроме того, поддерживаемые выражения регулярных выражений реализованы совершенно нестандартным образом, так что результаты могут отличаться от ожидаемых от чего-то вроде grep или perl.
Regex Line Position anchors ^ и $
^
соответствует началу входного потока, а также любой позиции, следующей сразу за <LF>. Поскольку FINDSTR также разбивает строки после <LF>, простое регулярное выражение «^» всегда будет соответствовать всем строкам в файле, даже двоичному файлу.$
соответствует любой позиции, непосредственно предшествующей <CR>. Это означает, что строка поиска регулярного выражения$
никогда не будет совпадать ни с одной строкой в текстовом файле стиля Unix, а также с последней строкой текстового файла Windows, если в ней отсутствует маркер EOL для <CR> <LF>.Примечание. Как уже говорилось ранее, возможно,
<CR><LF>
что к FINDSTR добавлен канал и перенаправленный ввод , которого нет в источнике. Очевидно, что это может повлиять на поиск регулярных выражений, который использует$
.Любая строка поиска с символами до
^
или после$
всегда не сможет найти совпадение.Позиционные опции / B / E / X
Позиционные опции работают так же, как
^
и$
, за исключением того, что они также работают для буквенных строк поиска./ B работает так же, как
^
в начале строки поиска регулярных выражений./ E работает так же, как
$
в конце строки поиска регулярного выражения./ X работает так же, как и
^
в начале, и$
в конце строки поиска регулярного выражения.Граница слова
\<
регулярного выражения должна быть самым первым термином в регулярном выражении. Регулярное выражение не будет соответствовать чему-либо, если ему предшествуют другие символы.\<
соответствует либо самому началу ввода, началу строки (позиции, следующей сразу за <LF>), либо позиции, следующей сразу за любым «несловесным» символом. Следующий символ не обязательно должен быть «словом».\>
должно быть самый последний член в регулярном выражении. Регулярное выражение не будет соответствовать чему-либо, если за ним следуют другие символы.\>
соответствует либо концу ввода, позиции непосредственно перед <CR>, либо позиции, непосредственно предшествующей любому «несловесному» символу. Предыдущий символ не обязательно должен быть символом «слово».Вот полный список «несловесных» символов, представленных в виде десятичного байтового кода. Обратите внимание - этот список был составлен на американском компьютере. Я не знаю, какое влияние на этот список могут оказать другие языки.
Диапазоны классов символов Regex [xy]
Диапазоны классов символов не работают должным образом. Посмотрите на этот вопрос: почему findstr неправильно обрабатывает регистр (в некоторых случаях)? вместе с этим ответом: https://stackoverflow.com/a/8767815/1012053 .
Проблема в том, что FINDSTR не сопоставляет символы по значению их байтового кода (обычно считается кодом ASCII, но ASCII определяется только от 0x00 до 0x7F). Большинство реализаций регулярных выражений рассматривали бы [AZ] как все заглавные буквы английского алфавита. Но FINDSTR использует последовательность сортировки, которая примерно соответствует тому, как работает SORT. Таким образом, [AZ] включает полный английский алфавит, как в верхнем, так и в нижнем регистре (кроме «а»), а также неанглийские буквенные символы с диакритическими знаками.
Ниже приведен полный список всех символов, поддерживаемых FINDSTR, отсортированных в последовательности сопоставления, используемой FINDSTR для установления диапазонов классов символов регулярных выражений. Символы представлены в виде их десятичного значения байтового кода. Я считаю, что последовательность сортировки имеет смысл, если символы просматриваются с использованием кодовой страницы 437. Примечание. Этот список был составлен на компьютере США. Я не знаю, какое влияние на этот список могут оказать другие языки.
Ограничение термина класса символов Regex и BUG
Мало того, что FINDSTR ограничен максимум 15 терминами класса символа в регулярном выражении, он не может должным образом обработать попытку превысить предел. Использование 16 или более символов класса символов приводит к появлению интерактивного всплывающего окна Windows с сообщением «Утилита Find String (QGREP) столкнулась с проблемой и должна быть закрыта. Приносим извинения за неудобства». Текст сообщения немного различается в зависимости от версии Windows. Вот один пример FINDSTR, который потерпит неудачу:
Об этой ошибке сообщил пользователь DosTips Judago здесь . Это было подтверждено на XP, Vista и Windows 7.
Поиск по
регулярному выражению завершается ошибкой (и может зависать бесконечно), если он включает в себя байт-код 0xFF (десятичное число 255). Любой поиск по регулярному выражению, который включает байт-код 0xFF (десятичное число 255), завершится неудачей. Сбой, если байт-код 0xFF включен напрямую или неявно включен в диапазон классов символов. Помните, что диапазоны классов символов FINDSTR не сопоставляют символы на основе значения байтового кода. Характер
<0xFF>
появляется относительно рано в последовательности сопоставления между<space>
и<tab>
символами. Таким образом, любой диапазон классов персонажей, который включает и то<space>
и другое<tab>
, потерпит неудачу.Точное поведение немного меняется в зависимости от версии Windows. Windows 7 зависает бесконечно, если включен 0xFF. XP не зависает, но всегда не может найти совпадение и иногда выдает следующее сообщение об ошибке: «Процесс пытался записать в несуществующий канал».
У меня больше нет доступа к машине с Vista, поэтому я не смог протестировать на Vista.
Ошибка
.
[^anySet]
регулярного выражения : и может соответствовать концу файла . Метасимвол регулярного выражения
.
должен соответствовать только любому символу, кроме<CR>
или<LF>
. Существует ошибка, которая позволяет ему соответствовать концу файла, если последняя строка в файле не заканчивается<CR>
или<LF>
. Однако, это.
не будет соответствовать пустому файлу.Например, файл с именем «test.txt», содержащий одну строку
x
, без завершения<CR>
или<LF>
, будет соответствовать следующему:Эта ошибка была подтверждена на XP и Win7.
То же самое можно сказать и о негативных наборах символов. Нечто подобное
[^abc]
будет соответствовать End-Of-File. Позитивные наборы символов вроде[abc]
бы работают нормально. Я проверял это только на Win7.источник
type
вfindstr
.findstr
поддерживает несколько/c:
строк поиска. Я знаю, что ваши ответы действительно демонстрируют это. Но это то, что не задокументировано; и я был очень удивлен, узнав об этой функции послеfindstr
нескольких лет использования без нее.LF
проблемы, которую вы задокументировали. Я понял, что мой тестовый файл не заканчивается,LF
потому что я использовалcopy
в режиме добавления, чтобы создать его. Я поместил сеанс командной строки, чтобы продемонстрировать проблему в ответе ( stackoverflow.com/a/22943056/224704 ). Обратите внимание, что ввод не перенаправлен, и все же поиск зависает. Точно такая же команда поиска не висит с меньшими файлами, которые также не заканчиваютсяLF
.findstr /R /C:"^[0-9][0-9]* [0-3][0-9][0-9]-[0-9][0-9]:[0-5][0-9]:[0-5][0-9]\.[0-9][0-9]* [0-9]*\.[0-9]*"
(15 классов символов) -ErrorLevel = -1073740791 (0xC0000409)
, диалоговое окно ошибки :Find String (QGREP) Utility has stopped working
; после удаления одного класса или двух метасимволов (*\.
) это работает ...findstr
иногда неожиданно зависает при поиске больших файлов.Я не подтвердил точные условия или размеры границ. Я подозреваю, что любой файл размером более 2 ГБ может быть в опасности.
У меня был смешанный опыт с этим, так что это больше, чем просто размер файла. Похоже, что это может быть разновидностью зависания FINDSTR в XP и Windows 7, если перенаправленный ввод не заканчивается LF , но, как показано, эта конкретная проблема проявляется, когда ввод не перенаправлен.
Следующий сеанс командной строки (Windows 7) демонстрирует, как
findstr
может зависать при поиске файла 3 ГБ.Обратите внимание, что в шестнадцатеричном редакторе я проверил, что все строки заканчиваются
CRLF
. Единственная аномалия в том, что файл завершается0x1A
из- за способаcopy
работы . Однако обратите внимание, что эта аномалия не вызывает проблем с «маленькими» файлами .С дополнительным тестированием я подтвердил следующее:
copy
с/b
опцией для двоичных файлов предотвращает добавление0x1A
символа иfindstr
не зависает на файле 3 ГБ.findstr
к зависанию.0x1A
не вызывает никаких проблем в «маленьком» файле. (Аналогично для других завершающих символов.)CRLF
после0x1A
решает проблему. (LF
само по себе, вероятно, будет достаточно.)type
для передачи файла вfindstr
работу без зависания. (Это может быть связано с побочным эффектом одногоtype
или другого|
дополнительного конца строки.)<
также вызываетfindstr
зависание. Но это ожидается; как объяснено в посте dbenham : «перенаправленный ввод должен заканчиваться наLF
» .источник
<LF>
. Файл на два байта меньше не висел. Очень противно!Когда несколько команд заключены в круглые скобки и файлы перенаправлены на весь блок:
... тогда файлы остаются открытыми, пока команды в блоке активны, поэтому команды могут перемещать указатель файла перенаправленных файлов. Обе команды MORE и FIND перемещают указатель файла Stdin в начало файла перед его обработкой, поэтому один и тот же файл может обрабатываться несколько раз внутри блока. Например, этот код:
... произвести тот же результат, что и этот:
Этот код:
... произвести тот же результат, что и этот:
FINDSTR отличается; он не перемещает указатель файла Stdin из его текущей позиции. Например, этот код вставляет новую строку после строки поиска:
Мы можем эффективно использовать эту функцию с помощью вспомогательной программы, которая позволяет нам перемещать указатель файла перенаправленного файла, как показано в этом примере .
Об этом поведении впервые сообщил Джеб на этом посту .
РЕДАКТИРОВАТЬ 2018-08-18 : сообщается о новой ошибке FINDSTR
У команды FINDSTR есть странная ошибка, которая возникает, когда эта команда используется для отображения символов в цвете И выходные данные такой команды перенаправляются на устройство CON. Подробнее о том, как использовать команду FINDSTR для отображения текста в цвете, см. Этот раздел .
Когда вывод этой формы команды FINDSTR перенаправляется на CON, происходит нечто странное после того, как текст выводится в желаемом цвете: весь текст после него выводится в виде «невидимых» символов, хотя более точное описание состоит в том, что текст вывод в виде черного текста на черном фоне. Исходный текст появится, если вы используете команду COLOR для сброса цветов переднего плана и фона всего экрана. Однако, когда текст «невидим», мы можем выполнить команду SET / P, поэтому все введенные символы не будут отображаться на экране. Такое поведение может быть использовано для ввода паролей.
источник
Я хотел бы сообщить об ошибке в разделе « Источник данных» для поиска в первом ответе при использовании en dash (-) или em dash (-) в имени файла.
Более конкретно, если вы собираетесь использовать первый вариант - имена файлов, указанные в качестве аргументов , файл не будет найден. Как только вы используете опцию 2 - stdin через перенаправление или 3 - поток данных из канала , findstr найдет файл.
Например, этот простой пакетный скрипт:
напечатает:
Имя файла с тире:
В качестве аргумента
FINDSTR: Невозможно открыть имя файла с - dash.txt
Как STDIN через перенаправление,
я файл с черточкой.
Как поток данных из трубы,
я файл с черточкой.
Имя файла с em dash:
В качестве аргумента
FINDSTR: Невозможно открыть имя файла с - dash.txt
Как STDIN через перенаправление
я файл с тире.
Как поток данных из канала,
я являюсь файлом с тире.
Надеюсь, поможет.
М.
источник
findstr
Команда устанавливаетErrorLevel
(или код выхода) к одному из следующих значений, учитывая , что нет никаких недействительных или несовместимых выключателей и не строка поиска не превышает предельное значение длины:0
когда хотя бы одно совпадение встречается в одной строке во всех указанных файлах;1
в противном случае;Считается, что строка содержит совпадение, если:
/V
задана опция и выражение поиск происходит по крайней мере один раз;/V
задана опция и выражение поиска не происходит;Это означает, что
/V
опция также изменяет возвращаемое значениеErrorLevel
, но не просто возвращает его!Например, если у вас есть файл
test.txt
с двумя линиями, одна из которых содержит строку ,text
а другой нет, какfindstr "text" "test.txt"
иfindstr /V "text" "test.txt"
возвращатьErrorLevel
из0
.По сути, вы можете сказать: если
findstr
возвращается хотя бы строка,ErrorLevel
устанавливается значение0
, иначе -1
.Обратите внимание, что
/M
параметр не влияет наErrorLevel
значение, он просто изменяет вывод.(Просто ради полноты:
find
команда ведет себя точно так же по отношению к/V
опции иErrorLevel
;/C
опция не влияетErrorLevel
.)источник
У FINDSTR есть ошибка цвета, которую я описал и решил по адресу /superuser/1535810/is-there-a-better-way-to-mitigate-this-obscure-color-bug-when-piping-to -findstr / 1538802? noredirect = 1 # comment2339443_1538802
Подводя итог, можно сказать, что ошибка заключается в том, что если входные данные передаются в FINDSTR в заключенном в скобки блоке кода, встроенные экранирующие цветовые коды ANSI перестают работать в командах, выполняемых позже. Пример встроенных цветовых кодов:
echo %magenta%Alert: Something bad happened%yellow%
(где пурпурный и желтый - переменные, определенные ранее в файле .bat как соответствующие escape-коды ANSI).Моим первоначальным решением было вызвать подпрограмму «ничего не делать» после FINDSTR. Каким-то образом вызов или возврат «сбрасывает» все, что необходимо сбросить.
Позже я обнаружил другое решение, которое предположительно является более эффективным: поместите фразу FINDSTR в скобки, как показано в следующем примере:
echo success | ( FINDSTR /R success )
размещение фразы FINDSTR во вложенном блоке кода, по-видимому, изолирует ошибку цветового кода FINDSTR, поэтому она не влияет на то, что находится за пределами вложенного блок. Возможно, этот метод решит и некоторые другие нежелательные побочные эффекты FINDSTR .источник
/ D совет для нескольких каталогов: поместите ваш список каталогов перед строкой поиска. Это все работает:
Как и ожидалось, путь относительно местоположения, если вы не начинаете каталоги с
\
. Обводить путь с помощью"
необязательно, если в именах каталогов нет пробелов. Окончание не\
является обязательным. Вывод местоположения будет включать в себя любой путь, который вы дадите. Он будет работать с или без окружения списка каталогов"
.источник
/D:dirlist Search a semicolon-delimited list of directories
он помещается перед строкой поиска, поэтому я не понимаю, что именно вы "нашли" в ключе / D (и какие "команды" НЕ работай ") ...findstr
списков / D в первую очередь. Да, я не спорю с документируемой функцией, просто не задокументировано о том, что порядок атрибутов имеет значение. Я очень мало работаю с командной строкой, поэтому, когда я комментировал команду, не зная, какой порядок имеет значение, я просто добавлял атрибуты по мере их поступления (и в алфавитном порядке C предшествует D). Я был очень расстроен и поделился своим «найденным» опытом для всех, кто не работает с командной строкой.findstr
документации указано, что этаstrings
часть НЕ является необязательной, и что вы должны разместить ее после необязательных атрибутов и перед необязательным списком имен файлов. Если «ваш результат» заключается в том, что использование команды без соблюдения ее формата использования приводит к ошибке, то такой момент хорошо задокументирован. См. Синтаксис команды : «Синтаксис появляется в том порядке, в котором вы должны ввести команду и любые параметры, следующие за ней»