Позавчера мне пришлось написать простенький командный файл, бекапящий профиль приложения. В качестве имени папки с резервной копией мне возжелалось использовать переменные окружения %date% и %time%. Если вы проходили в институте начальный курс информатики, вы должны знать, что %time% в этом случае является ничем иным, как граблями, остро торчащими на пути, так значение содержит недопустимый символ “:”. Я никогда не занимался разбором строк в командных файлах, и случай как нельзя лучше подходил для того, чтобы прокачать свои скилы.
Я хочу поделиться с вами своими изысканиями, и анонсирую скучную, унылую техническую статью. Дочитавшему до конца – покажу котика.
В современных ОС интерпретатор командной строки позволяет выполнять простейшие строковые операции:
Замена символов/подстроки в переменной командной строки
Это то, что мне было нужно в первую очередь. Напомню, моя задача в первую очередь избавиться от двоеточий.
Решается очень просто:
В этом примере используется синтаксис вида:
В моем случае заменяется двоеточие на символ нижнего подчеркивания, и результат выглядит так:

Само собой, можно заменять не отдельные символы, а целые словосочетания:

Как ещё можно воспользоваться функцией замены? Например:
Удалить все пробелы из значения переменной

Замена какой-либо части строки
Вы можете использовать символ “*” для определения того, что обработке подлежит часть строки, предшествующая указанному выражением. Я не знаю, как написать это по-человечески, вот что я имею ввиду:

К сожалению, “звёздочкой” нельзя указать, что отсечь надо часть строки после указанного выражения. Эта задача решается в два этапа:
- в отдельную переменную помещается строка, из которой удалено всё, что находится до ключевого выражения. Т.е. в ней остается “хвост”, искомое выражение плюс всё, что после него.
- затем из оригинальной переменной удаляется значение переменной, полученной на первом шаге. Здесь потребуется вызов команды СALL:

Инструкция CALL необходима для разворачивания значения переменной, подлежащей замене. Без неё интерпретатор отработает неверно, и вот эта конструкция не сработает:
Не забывайте, что при использовании таких конструкций в командных файлах знаки процентов должны быть удвоены:
Используя опыт, полученный выше, можно написать простейшую проверку вида “содержит/не содержит”.
Например, вот так:

Выделение подстроки из переменной
Для получения подстроки из строки командный интерпретатор предоставляет такую конструкцию:
Синтаксис очень простой, поэтому сразу перейдем к примерам.
Выделение подстроки с начиная определенной позиции

Выделение части строки, например, “середины”

Выделение определенного количества символов

Начальная позиции строки – нулевая.
Работа с наборами “ключ – значение”
Здесь, в общем-то, тоже никакой магии нет. В основе разбора лежит всё та же рассмотренная выше замена подстроки на пустое значение.
Алгоритм действий такой:
- Создается переменная, содежащая в себе значения вида <ключ><разделитель значения><значение><разделитель пары>. Назовем её условно “словарь”.
- В переменную, которая будет содержать значение, записывается всё, что следует после ключа. По аналоги с заменой части строки, нужно использовать звездочку перед выражением <ключ><разделитель значения>.
- Полученный результат нужно “почистить”, так как он может содержать в себе остаток словаря. Для этого прибегнем к хитрости и выполним составную команду.
Предположим, мы в качестве разделителя пары словаря используем точку с запятой. Тогда мы сможем довольно изящно “убить” оставшуюся часть словаря, поместив его в комментарии командой rem.
[code]set value=%value:;=&rem %[/code] После rem – пробел, это важно(rem /?)
Теперь практический пример:

Я надеюсь, эта информация оказалась для вас полезной и сэкономит вам время, если у вас появится задача обработки строк. Впрочем, тему я раскрыл не полностью, и если у вас есть какие-то дельные личные наработки и приёмы обработки строк в командном интерпретаторе Windows, я совсем не против увидеть их в комментариях.
Материалы по теме:
Форум о скриптах на OSZone – рекомендую.
Спасибо, что дочитали до конца.

Судя по тому, что вы читаете этот текст, вы дочитали эту статью до конца. Если она вам понравилась, поделитесь, пожалуйста, с помощью кнопок ниже. Спасибо за вашу поддержку!
Findstr command on Windows is useful for searching for specific text pattern in files. It’s functionality is similar to the grep command on Linux OS. You can find below the syntax of ‘findstr’ for various use cases.
Search for text/string in a file:
findstr pattern filename
For example, to search for the string ‘Windows’ in the text file CLItips.txt, the command would be as below.
findstr Windows CLItips.txt
Note that the above command looks for exactly ‘Windows’. It considers case by default. So if you have a line that has the word ‘windows’, it would not be printed in the output of the above command.
Ignore text case:
You can add /I switch to ignore the case in the search. So if you run ‘findstr windows /I CLItips.txt‘, it does case insensitive pattern matching.
Search for any of the given words
If you want to print the lines having any of the given word set, you can enclose the list of words in double quotes in findstr command.
findstr "word1 word2 word3.." filename.txt
findstr "Apple Orange" fruits.txt
This command would print a line if it has has either the word ‘Apple’ or the word ‘Orange’ or both the words.
Search for pattern with multiple words
findstr /C:"word1 word2 word3..." filename
/C indicates that the search pattern has to be matched literally.
For example, to search for the string “Apple Ball Cat” in file Book.txt, the command would be as below
findstr /C:"Apple Ball Cat" Book.txt
Search with Regular Expressions
You can use regular expressions with findstr /R switch. Typical command would be as below.
findstr /R pattern filename.txt
Here the pattern can be specified using regular expressions.
Examples:
Search for the occurrence of all words ending with ‘xyz’ in a file.
findstr /R [a-z]*xyz filename.txt
Search for text in all the files in a current directory
You can use wildcard ‘*” to specify that all the files in a directory should be searched for the given string.
For example, to search for ‘windows’ in all the files in the current directory, you can use the below command.
findstr /I windows *
To search all the text files in the directory C:\data:
findstr /I windows C:\data\*.txt
Search for multiple strings
If you need to search for multiple strings, then you can do that with the below batch script.
@echo off for /F %%i in (pattern.txt) do ( echo Files containing %%i findstr /M /C:%%i /S *.txt )
‘pattern.txt ‘is the file having the strings(one per line) that need to be searched for. The above command searches only text files. You can customize the findstr command in the script to search in files with other extensions. Adding ‘/M’ option to the command causes to print only the file names.
Print only the lines where the given string is at the beginning of the line.
You can add /B switch to indicate that the specified string should be in the beginning of the line.
findstr /B /C:windows CLItips.txt
Print only the lines where the given string is at the end of the line
findstr /E /C:windows CLItips.txt
Print line numbers for all the matched lines.
You can add /N switch to the findstr command to print line numbers for the matched lines.
Print only the filenames
finstr /M /C:"pattern" *.log
This command searches for the pattern in all *.log files, and then prints only the file names having the pattern. Even if a file has multiple occurrences of the pattern, it’s printed only once by findstr.
Команда FINDSTR
FINDSTR
FIND
не
\Q . . . набор метасимволов . . .\E
Обратная косая черта перед обычным символом означает, что он интерпретируется как служебный символ:
– соответствует символу пробела.
При использовании в регулярных выражениях, строчные и заглавные символы различаются.
– любой символ, не пробел.
Формат командной строки FINDSTR:
Для разделения нескольких искомых строк, если аргумент не
имеет префикса /C, используется пробел. Например,
FINDSTR “Привет мир” file.txt поиск “Привет” или “мир” в файле file.txt
FINDSTR /C:”Привет мир” file.txt поиск строки “Привет мир” в файле file.txt.
Краткую справку по использованию команды FINDSTR можно получить при использовании ключа /?:
Кроме параметров командной строки, справка дополнена краткой сводкой по синтаксису регулярных выражений:
За полной информацией о регулярных выражениях FINDSTR обратитесь к доступной
интерактивной документации.
Примеры использования FINDSTR:
findstr /P /I “Error” %temp%\*.* – Отобразить строки, содержащие слово Error . Поиск строк выполнять без учета регистра символов ( ключ /I ), строки, содержащие непечатаемые символы, не отображать ( ключ /P ) .
findstr /M /I /C:”network error” %windir%\system32\*.exe – отобразить список исполняемых файлов из системного каталога Windows\system32, в которых встречается строка “network error “
findstr /s /I /A:f4 /O /C:”failed” C:\*.log – отобразить строки файлов с расширением log, содержащие слово failed. Имя файла и смещение строки относительно его начала отображать красными символами на белом фоне ( ключ /A:F4 ). Поиск выполняется во всех файлах .log корневого каталога диска C: и всех его подкаталогов ( ключ /S )
findstr /A:FC /N /s /i “\< comput.*” *.* – отобразить строки, содержащие слово, начинающееся с ” comput” ( compute, computer, computers и т. д. ), а также имена файлов и номера строк ( ключ /N ).
findstr /A:FC /N /s /i “\< правильн.*” *.* – как и в предыдущем случае, но ищется строка, содержащая слово, начинающееся с подстроки правильн. При использовании символов русского языка нужно учитывать их кодировку, поскольку коды символов в DOS- и Windows – кодировке различаются. В командных файлах, когда необходимо выполнять поиск строк, содержащих символы национального алфавита, шаблон для поиска должен быть представлен в той же кодировке, что и содержимое файла. Можно использовать переключение кодовой страницы перед поиском:
REM переключаемся на Windows – кодировку
chcp 1251
REM Выполняем поиск
findstr /A:FC /N /s /i “\< правильн.*” *.*
REM Переключаемся на DOS – кодировку
chcp 866
REM Выполняем поиск
findstr /A:FC /N /s /i “\< правильн.*” *.*
Весь список команд CMD Windows
Команда FIND – поиск строки символов в файле
FIND
Формат командной строки:
FIND /? – выдать справку по использованию команды.
find /I myfile.txt “новость” – выполнить поиск строки новость без учета регистра символов в текстовом файле myfile.txt . По умолчанию, если не задан параметр /I
регистр символов учитывается.
find /C myfile.txt “новость” – отобразить общее количество строк, содержащих текст “новость”.
FIND /I %TEMP%\*.tmp “windows” – выполнить поиск в каталоге временных файлов для всех файлов с расширением tmp строк , содержащих текст windows без учета регистра символов.
Обратите внимание, на нехарактерный синтаксис этой команды – строка поиска обязательно заключается в двойные кавычки, поэтому имена и пути файлов,
содержащих пробелы, обрабатываются некорректно. Для поиска в таких файлах можно воспользоваться перенаправлением ввода ( символ < )
Соответственно, пример с поиском во временных файлах, приведенный выше, в ОС Windows XP ( значение переменной %TEMP% по умолчанию принимает путь с пробелами ) будет выполняться
верно при использовании следующей команды:
FIND /I “windows” < “%TEMP%\textfile.tmp”
Естественно, шаблон имени файла *.tmp использовавшийся в примере выше, при перенаправлении ввода применять нельзя ( перенаправление можно выполнять
для конкретного файла – textfile.tmp в примере ) и для организации поиска текстовой строки в нескольких файлах можно воспользоваться циклической обработкой их содержимого , например, с помощью команды
FOR.
Применение команды FIND для поиска строки в результатах вывода другой программы используется, например,
для определения доступности сетевого узла с помощью команды PING . Утилита ping.exe не возвращает признак
доступности пингуемого адреса в значении переменной ERRORLEVEL (Ненулевое значение ERRORLEVEL утилита ping.exe формирует только в том случае, если заданы ошибочные параметры командной строки). Поэтому, для определения
доступности IP- адреса, используется анализ вывода ping.exe, который отличается для доступного и недоступного узла. Так, например, если пингуемый адрес доступен,
то в сообщении будет присутствовать значение TTL:
А в случае недоступности, строка символов “TTL” в выводимых результатах отсутствует. Если строка символов
“TTL” найдена, то FIND сформирует значение переменной ERRORLEVEL равным 0
Таким образом, для определения факта доступности узла в командном файле можно воспользоваться следующим
способом:
Команда ping используется в цепочке с командой find (конвейер ) и результаты ее вывода используются в качестве
ввода для поиска строки “TTL“. В конвейер добавлена команда перенаправления стандартного вывода на фиктивное устройство nul, т.е. подавление вывода. Ключ -n 1 задает однократный опрос узла COMPUTER для ping.exe.
Весь список команд CMD Windows
FOR
Формат командной строки:
%переменная – Однобуквенный подставляемый параметр.
(набор) – Определяет набор, состоящий из одного или нескольких
элементов, обрабатываемых командой.
команда – Команда, которую следует выполнить для каждого элемента набора.
параметры – Параметры для команды, выполняемой по отношению к элементам набора.
.
В пакетных файлах для команды FOR используется запись
%%переменная вместо %переменная. Имена переменных
учитывают регистр букв (%i отличается от %I).
Поддерживаются также дополнительные форма команды FOR:
Ключ /D задает в качестве набора имена каталогов (не файлов).
Ключ /L задает обработку набора из последовательности чисел с заданными
началом, концом и шагом приращения. Так, набор (1,1,5) раскрывается в (1 2 3 4 5), а набор (5,-1,1) – в (5 4 3 2 1)
Ключ /F задает обработку файлов, строковых значений или результатов стандартного вывода другой команды. Набор файлов – содержит имена одного или нескольких файлов,
которые по очереди открываются, читаются и обрабатываются.
Обработка состоит в чтении файла, разбивке его на отдельные
строки текста и разборе каждой строки в ноль или более подстрок.
Затем вызывается тело цикла “for”, при выполнении которого
каждая найденная подстрока используется в качестве значения
переменной. По умолчанию ключ /F выделяет из каждой строки
каждого файла первую отделенную пробелами подстроку. Пустые
строки в файле пропускаются. Необязательный параметр “ключи”
служит для переопределения правил разбора по умолчанию. Он
представляет собой заключенную в кавычки строку, содержащую
одно или несколько ключевых слов для определения параметров
разбора. Ключевые слова:
eol=символ – знак начала комментария в конце строки ( признак конца обрабатываемых данных строки). Задается в виде одиночного символа.
skip=n – число пропускаемых при обработке строк от начала
файла.
delims=xxx – набор разделителей между обрабатываемыми элементами строк. По
умолчанию, в качестве разделителей используются пробелы и знаки табуляции.
tokens=x,y,m-n – номера подстрок из каждой строки, передаваемые в тело
цикла “for” для каждой итерации. Например, для обычного текстового файла, подстроками будут слова, а разделителями подстрок – пробелы или знаки табуляции. При использовании этого ключа выделяются дополнительные имена переменных. Формат m-n представляет собой диапазон подстрок с номерами от m по n. Если последний знак
в строке tokens= является звездочкой, то создается
дополнительная переменная, значением которой будет
весь оставшийся текст в строке после разбора
последней подстроки.
usebackq – режим обработки кавычек. Строка,
заключенная в обратные кавычки, выполняется как
команда, строка, заключенная в прямые одиночные
кавычки, является строкой символов, а двойные
кавычки могут использоваться для задания имен
файлов, содержащих пробелы.
Выполняется разбор файла myfile.txt. Все строки, которые
начинаются с символа точки с запятой (eol=; ), пропускаются. Вторая и
третья подстроки из каждой строки ( tokens=2,3 ) передаются в тело цикла “for”, причем
подстроки разделяются запятыми и/или пробелами.
В теле цикла переменная %i принимает значение второй
подстроки, %j – третьей, а %k – все оставшееся
поле до конца строки после третьей подстроки . Имена файлов, содержащие пробелы,
необходимо заключать в двойные кавычки. Чтобы использовать
двойные кавычки, необходимо использовать параметр usebackq,
иначе двойные кавычки будут восприняты как определение
строки-литерала для разбора.
В данном примере переменная %i явно объявлена в инструкции “for”, а переменные
%j и %k объявляются неявно с помощью ключа tokens= .
Ключ tokens= позволяет извлечь из одной строки файла до
26 подстрок. Следует помнить, что имена переменных FOR являются однобуквенными,
с учетом регистра, поэтому одновременно не может быть активно более 52 переменных, задаваемых как явно, так и неявно.
Команда FOR /F может также использоваться для обработки
явно заданной строки, заключенной в одиночные кавычки и
указанной в качестве параметра в скобках. Она будет разобрана
так же, как одиночная строка, считанная из входного файла.
В качестве обрабатываемого набора, также,
может быть использован вывод ( выходные
данные ) другой команды. В этом случае используется
в качестве параметра в скобках строка в обратных одиночных
кавычках . Эта строка передается для выполнения дочернему
обработчику команд CMD.EXE, а вывод этой команды
сохраняется в памяти и разбирается так, как если бы это
был файл. Пример:
В команде FOR возможно использование ссылок на переменные.
Допускается применение следующих синтаксических конструкций:
%~I – из переменной %I удаляются обрамляющие кавычки (“)
%~fI – переменная %I расширяется до полного имени файла
%~dI – из переменной %I выделяется только имя диска
%~pI – из переменной %I выделяется только путь к файлу
%~nI – из переменной %I выделяется только имя файла
%~xI – из переменной %I выделяется расширение имени файла
%~sI – полученный путь содержит только короткие имена
%~aI – переменная %I расширяется до атрибутов файла
%~tI – переменная %I расширяется до даты /времени файла
%~zI – переменная %I расширяется до размера файла
%~$path:I – проводится поиск по каталогам, заданным в переменной среды path, и переменная %I заменяется на полное имя первого найденного файла.
Если переменная path не определена или в результате поиска не найден ни один файл, то этот модификатор заменяется на пустую строку.
При объединении нескольких операторов можно получить следующие результаты:
~dpI – переменная I раскрывается в имя диска и путь
~nxI – переменная I раскрывается в имя файла и его расширение
~fsI – переменная I раскрывается в полный путь с короткими именами
~dp$path:I – проводится поиск по каталогам, заданным в переменной среды path, и переменная I раскрывается в имя диска и путь к первому найденному файлу.
~ftzaI – переменная I раскрывается в строку, подобную выдаваемой командой DIR
В приведенных выше примерах переменные I и path можно
заменить на другие допустимые значения. Синтаксическая
конструкция с символами ~ заканчивается допустимым именем
переменной цикла FOR.
Для имен переменных рекомендуется использовать заглавные
буквы, например –I, что делает эту конструкцию более удобной
для чтения и предотвращает ошибочное принятие их за
модификаторы, которые не различают регистр.
При использовании команды FOR в командных файлах, если внутри цикла нужно выполнить более одной команды, то они заключаются в скобки:
Обычно, в командных файлах команда FOR используется не только для разбора данных, но и их обработки, что требует использования переменных внутри цикла FOR. И здесь возникает проблема – изменения значений переменных не происходит, т.е. их применение внутри скобок невозможно. Подобное явление вызвано не логическими предпосылками, а всего лишь определенными особенностями реализации командного процессора CMD.EXE, и это нужно обязательно учитывать при обработке переменных внутри циклов команд FOR и IF. Другими словами, использование значений переменных внутри скобок, требует изменения стандартного режима интерпретации командного процессора. Разработчиками предусмотрена возможность запуска CMD.EXE с параметром /V:ON, что включает разрешение отложенного расширения переменных среды с применением символа восклицательного знака (!) в качестве разделителя. То есть, параметр /V:ON разрешает использовать !var! в качестве значения переменной var во время выполнения внутри циклов команд FOR и IF. Но на практике чаще используется возможность локального включения данного режима внутри командного файла специальной директивой:
После чего, можно обрабатывать принимаемые переменными значения внутри цикла, используя вместо знаков процента восклицательные знаки. Синтаксически, использование обоих разделителей допускается, но результаты этого использования будут разными, что наглядно демонстрируется следующим командным файлом:
Данная особенность реализации командного процессора Windows нередко приводит к неожиданным результатам при использовании групп команд, объединенных скобками в конструкциях FOR и IF и тогда, когда значение какой-либо переменной изменяется внутри цикла с одной командой. Например, для получения списка файлов текущего каталога такой командный файл работать не будет:
Вроде бы, логически все верно, но не учтена особенность обработки значений переменных. Значение переменной LIST внутри цикла команды FOR изменено не будет, оно останется пустым ( задано командой SET LIST= ), каким и было на начало цикла FOR. Команда SET LIST= %LIST% %%I должна в каждом цикле менять значение переменной LIST на текущее, плюс символ пробела, и плюс текущее значение переменной I, которое принимает значение имени файла в текущем каталоге. Синтаксически, команда верная, но из-за озвученной выше особенности реализации командного процессора – не работает, и значение переменной LIST не изменяется. Для того, чтобы это произошло, командный файл нужно изменить, таким же образом, как и в примере для группы команд:
Эту особенность реализации CMD нужно учитывать и при использовании значений системных переменных внутри циклов, как например, переменной ERRORLEVEL:
IF !ERRORLEVEL!==0 вместо %ERRORLEVEL%==0
Весь список команд CMD Windows
Search for a text string in a file (or multiple files) unlike the simple FIND command FINDSTR supports more complex regular expressions.
When using /G or /F the text file should be a plain ANSI text file with one Search string or Filename/Path on each line.
If more than one file is searched (/F), the results will be prefixed with the filename where the text was found.
The default behaviour of FINDSTR is to match any word, so FINDSTR “blue planet” will match the word blue or the word planet.
To match an entire phrase/sentence or to use Regular Expressions use the /C and /R options.
Option syntax
Options can be prefixed with either / or –
Options can also be concatenated after a single / or -. However, the concatenated option list can contain at most one multicharacter option such as OFF or F:, and the multi-character option must be the last option in the list.
The .* expression can be useful within a larger expression, for example a.*b will match any string beginning with A and ending with B.
FINDSTR does not support UTF-16 files, but FIND does.
Regex Line Position anchors ^ and $
$ matches any position immediately preceding a <CR>. This means that a regex search string containing $ will never match any lines within a Unix style text file, nor will it match the last line of a Windows text file if it is missing the EOL marker of <CR><LF>.
So to find the string snark at the end of a line, use snark$
Note – As detailed further below, piped and redirected input to FINDSTR can have <CR><LF> appended that is not in the source. This can impact a regex search that uses $.
A search string with characters (before ^) OR (after $) will always fail to find a match. $nevermatches^
Positional Options /B /E /X
The positional options work the same as ^ and $, except they also work for literal search strings.
/B functions the same as ^ at the start of a regex search string.
/E functions the same as $ at the end of a regex search string.
/X functions the same as having both ^ at the beginning and $ at the end of a regex search string.
FINDSTR – Escapes and Length limits – More detail of how to use search strings that include quotes and/or backslashes. Also maximum Search String length limits vary with OS version.
FINDSTR – Searching across line breaks
Regex character class ranges [x-y]
Character class ranges do not work as expected. See this Q/A on Stack Exchange: Why does findstr not handle case properly (in some circumstances)?
Default type of search: Literal vs Regular Expression
/C:”string” – The default match like /L literal, but will also accept spaces.
/R /C:”Search string” – This will perform a Regex match, but will also accept spaces in the search string.
“string argument” – The default depends on the content of the very first search string. (Remember that <space> is used to delimit search strings.) If the first search string is a valid regular expression that contains at least one un-escaped meta-character, then all search strings are treated as regular expressions. Otherwise all search strings are treated as literals. For example, “51.4 200” will be treated as two regular expressions because the first string contains an un-escaped dot, whereas “200 51.4” will be treated as two literals because the first string does not contain any meta-characters.
/G:file – The default depends on the content of the first non-empty line in the file. If the first search string is a valid regular expression that contains at least one un-escaped meta-character, then all search strings are treated as regular expressions. Otherwise all search strings are treated as literals.
Recommendation – Always explicitly specify /L literal option or /R regular expression option when using “string argument” or /G:file.
Searching for Spaces
When the search string contains multiple words, separated with spaces, then FINDSTR will return lines that contain either word (OR).
A literal search (/C:”string”) will reverse this behaviour and allow searching for a phrase or sentence. A literal search also allow searching for punctuation characters.
fileName = The name of the file containing the matching line. The file name is not printed if the request was explicitly for a single file, or if searching piped input or redirected input. When printed, the fileName will always include any path information provided. Additional path information will be added if the /S option is used. The printed path is always relative to the provided path, or relative to the current directory if none provided.
lineNumber = The line number of the matching line represented as a decimal value with 1 representing the 1st line of the input. Only printed if /N option is specified.
lineOffset = The decimal byte offset of the start of the matching line, with 0 representing the 1st character of the 1st line. Only printed if /O option is specified.
text = The binary representation of the matching line, including any <CR> and/or <LF>.
Nothing is left out of the binary output, such that this example that matches all lines will produce an exact binary copy of the original file:
Using a script file
Multiple search criteria can be specified with a script file /G
Multiple FileNames to search can be specified with /F
When preparing a source or script file, place each filename or search criteria on a new line.
If several filenames are to be searched they must all exist or FINDSTR will fail with an error.
Piping and Redirection
A text file can be piped or redirected into FINDSTR:
- Data stream from a pipe TYPE file.txt | FINDSTR “searchString”
- Stdin via redirection FINDSTR “searchString” <file.txt
Piped and Redirected input can have <CR><LF> appended:
- If the input is piped in and the last character of the stream is not <LF>, then FINDSTR will automatically append <CR><LF> to the input. (XP, Vista and Windows 7.)
- If the input is redirected and the last character of the file is not <LF>, then FINDSTR will automatically append <CR><LF> to the input. (Vista only), Note that in this case XP and Windows 7/2008 will not alter redirected input which can cause FINDSTR to hang indefinitely.
Errorlevel
0 (False) a match is found in at least one line of at least one file.
1 (True) if a match is not found in any line of any file, (or if the file is not found at all).
2 Wrong syntax
An invalid switch will only print an error message in the error stream.
Bugs
If the last character of a file used as redirected input does not end with <LF>, then FINDSTR will hang indefinitely once it reaches the end of the redirected file.
FINDSTR cannot search for null bytes commonly found in Unicode files.
- The search is using multiple literal search strings
- The search strings are of different lengths
- A short search string has some amount of overlap with a longer search string
- The search is case sensitive (no /I option)
In early versions of FindStr /F:file a path length of more than 80 chars will be truncated.
Утилита find командная строка
И так, смотрим на описание ключей:
– собственно, строчка, поиск которой производится из командной строки Windows
Хорошо, теперь давайте попробуем написать несколько примеров.
Создадим на диске D: папку TEST, в который благополучно поместим три файла с расширениями .pdf, .txt и .mf. Для начала попробуем найти слово «const» во всех документах с расширением txt:
FIND “const” D:TEST*.txt
На выходе мы получим следующую информацию:
Как видим, мы получили список всех тех строчек, где встречается искомое слово.
Теперь попробуем сделать поиск через командную строку слова “samsung” во всех pdf файлах:
FIND “samsung” D:TEST*.pdf
Слово «samsung» встречается в одном документе, но, утилита FІND найти его не смогла, стоит обратить внимание, что и стандартный поиск операционной системы Windows также ничего не нашел, видимо, Google в этом все же больше преуспел.
Теперь попробуем усложнить задачу. Дело в том, что Windows ищет фразу не только в контексте файла, но и в его свойствах. Посмотрим, будет ли утилита find командной строки Windows производить поиск из описания. Я специально, по одному из каждого типа файлов (.pdf, .txt и .mf) вставлю в описание фразу «Victoria Sanremo». И так, приступим:
FIND “Victoria Sanremo” D:TEST*.*
В результат выполнения команды find, командная строка ничего не нашла в свойствах документов. Кроме утилиты FІND, есть еще и CMD FINDSTR, которая обладает немного большими возможностями.
Утилита FINDSTR командная строка
Утилита CMD FINDSTR предоставляется возможность осуществить поиск текста через командную строку не только в одном файле, или группе документов заданных по шаблону, но и с возможностью загрузки готового списка. И так, прежде всего, давайте посмотрим на основной синтаксис.
– Данный ключ определяет поиск образца лишь в началах строчек.
— Данный ключ определяет поиск образца лишь в конце.
– Фразы и слова будут приниматься как регулярные выражения.
– Производит поиск файлов через командную строку в текущем каталоге и всех его подпапках.
– Данный ключ определяет, что поиск фразы из командной строки будет вестись без учета регистра.
– Производит вывод только тех строчек, которые содержат точное совпадение.
— Производит вывод только тех строчек, которые не содержат точного совпадения с искомой фразой.
— Производит вывод номера строчки (которые содержат точное совпадение) и ее содержимое.
— Производит вывод лишь имени документа, который содержит совпадение.
– Вывести список найденных строк через пустую строчку.
– Данный параметр определяет, что произойдет пропуск всех строк, которые содержат непечатаемые символы.
– Шестнадцатеричный код цвета, для получения справки можете ввести команду «COLOR /?»
– Производит чтение списка файлов из заданного документа.
– Использовать значение данного параметра как искомую фразу поиска.
– Позволяет получить список строк из заданного документа.
– Тут через точку с запятой мы можем задать список каталогов, в которых нужно произвести поиск через командную строку.
– Собственно, то, что мы ищем.
Что бы разделить между собой искомые фразы, между ними вставляется пробел, если параметр не содержит префикса /C. Например,
FINDSTR “Привет мир” data.txt
ищет «Привет» или «мир» в файле data.txt, а команда
FINDSTR /C:”Привет мир” data.txt
ищет фразу «Привет мир» в файле data.txt.
Регулярные выражения являются своеобразным бонусом, которым не то, что оболочка, но и язык программирования не всегда может похвастаться. При поиске из командной строки, регулярные выражения позволяют задавать собственные шаблоны (для справки по некоторым значениям введите в cmd findstr/? ), они также используются в сценариях сервера Windows Script Host, за это отвечает отдельный объект.
В этой статье мы рассмотри как используется цикл командной строки for для обработки текстовых строк и файлов. Тут будет фигурировать ключ /f, который меняет логику работы цикла командной строи (cmd) for и позволяет производить разбор любого текста по полочкам, так сказать.
Цикл cmd for – обработка текста
Для обработки текста или содержимого текстового файла применяется следующая конструкция:
Тут “параметры” задают параметры поиска, мы их рассмотрим ниже, “источник” – тут нужно указать или путь к текстовому файлу, или текст, или вывод команд, “оператор” – тут собственно, находятся команды для обработки текста. Сам текст можно хранить в переменной, имя которой мы зададим в качестве источника.
Значение “параметры” может быть одним или комбинацией таких параметров:
skip – позволяет в цикле cmd for задать количество строк, которые нужно пропустить, счет идет с начала файла, например, “skip=10” – в данном случае будут пропущены строки от первой до десятой.
delims – параметр позволяет задать дополнительные разделители строки на подстроки. Так, стандартными разделителями является пробел и символ табуляции. Например, “delims=,.:” – тут мы определили, что запятые, точки и двоеточия являются разделителями.
tokens — данный параметр командной стоки цикла for cmd позволяет указать, какие номера полей строки, полученных из заданного текста, нужно передать для обработки в цикл. Полученные поля будут храниться в отдельной переменной. Фактически, если принимать каждое слово строки как отдельный элемент, то параметр tokens позволяет указать, какие именно слова по счету нужно обработать. Как упоминалось выше, стандартным разделителем является пробел и табуляция.
Для дополнительной переменной, как и для переменной инициализации, в качестве имени указывается латинская буква, большая или маленькая. Значения можно указывать как через запятые, например, “tokens=1,4, 9” – первый, четвертый и девятый элемент, так и через диапазон, например, “tokens=4-11” – с четвертого по одиннадцатый. Можно комбинировать: “tokens=4-10,15,20” – с четвертого по десятый, а также, пятнадцатый и двадцатый элемент. Если мы укажем в качестве последнего значения звездочку, то создастся еще одна переменная, которая будет хранить в себе все остальные элементы (строки) текста.
usebackq – данный параметр является довольно интересным и полезным, так как позволяет выполнять команды, передав их как параметр. Включив этот параметр, двойные кавычки будут применяться для имен файлов и пути к ним, обратные кавычки (`), они находятся на той же кнопке, что и символ (~) – для исполняемых команд, а одинарные кавычки – для литеральных строк.
Хорошо, теперь можно рассмотреть цикл cmd for и работу с ним на практике.
Допустим, у нас есть файл test.txt, в котором прописаны такие строки:
Попробуем выполнить такой код:
off F A d:\work\test.txtA
Как видим, строка с комментарием не вывелась, но и остальные строки вывелись не полностью, что бы это исправить, напишем так:
off F A d:\work\test.txtA
Бинго, теперь нам вывело все строки полностью, кроме строки с комментариями, так как мы указали в параметре tokens значение *, то есть все. В предыдущем примере сценарий принимал пробелы как разделители.
Теперь запишем в текстовый файл такой текст:
off f A d:\work\test.txt Strana:A Stolica:B Valuta:C Produkt:D Echo.
Тут мы указали, что разделителем является тире, и указали, что надо обработать первые четыре поля строки, каждое из которых хранится в отдельной переменной. Как видим, в цикле for cmd идет обработка каждой строки из текста, на выходе мы получим:
Strana:Ukraina Stolica:Kijev Valuta:grivna Produkt:salo
Strana:Rossija Stolica:Moskva Valuta:rubl Produkt:bliny
Strana:Belorussija Stolica:Minsk Valuta:zajec Produkt:kartoska
Strana:Chechija Stolica:Praga Valuta:krona Produkt:pivo
Осталось рассмотреть пример с параметром usebackq:
off =d:\work\hello.txt f A Hello, Wold ^^ OK get_dir=
В данном случаем мы выполняем команду: записываем фразу “Hello, Wold” в текстовый файл, путь к которому содержится в переменной get_dir. В конце выводим содержимое файла и удаляем переменную.
What’s the equivalent of # for Windows cmd console sessions, to create a comment?
The operating system is Windows XP.

asked Dec 12, 2009 at 7:47
Andrew Grimm
6 gold badges30 silver badges37 bronze badges
REM is the standard way:
REM this is a commentYou could also use the double-colon convention commonly seen in batch files:
:: another commentNote that both of these methods only work at the beginning of a line. If you want to append a comment to a command, you can use them with the command concatenation character (&), like this:
dir & REM a comment
dir &:: another oneanswered Dec 12, 2009 at 8:51
You prefix your comment with the word REM.
REM This is a comment.echo This is a comment you'll see.answered Dec 12, 2009 at 7:50
To prevent these lines from being shown you can do one of three things.
- Add @echo off to the batch file:
If you want to hide all commands as well as the REM lines add @echo off as the first line in the batch file. - Change the REM to @REM:
If you want to have the commands shown when the batch file is run, but still want to hide the REM lines type @REM instead of REM. - Use ::(i.e. invalid lable) instead of REM:
Finally, using the :: as the remark command instead of REM also prevents the echo of the remarked line.
answered Mar 24, 2016 at 12:54

2 gold badges18 silver badges25 bronze badges
I believe the answer provided by bernhard is incorrect.
At least through win 7,
rem commentin a batch file will print in the output. To suppress printing, use
@ rem comment@rem commentanswered Nov 22, 2014 at 21:41
5 bronze badges
Everything started after exit (with a parentheses) is regarded as comment:
REM CODE
exit /b 0
(Hi
I am a comment
I am also the sameanswered Sep 17, 2020 at 6:19

2 gold badges15 silver badges32 bronze badges




