Cmd прочитать файл построчно
Сравнивает два файла или набора файлов и отображает различия между ними.
Синтаксис
Примеры
Чтобы выполнить сравнение в ASCII двух текстовых файлов: Monthly. rpt и Sales. rpt, и отобразить результаты в сокращенном формате, введите:
Чтобы создать двоичное сравнение двух пакетных файлов, profits.bat и earnings.bat, введите:
Отобразятся результаты, аналогичные приведенным ниже.
Чтобы сравнить каждый файл .bat в текущем каталоге с файлом new.bat, введите:
Чтобы сравнить файловый new.bat на диске C с файлом new.bat на диске D, введите:
Чтобы сравнить каждый пакетный файл в корневом каталоге диска C с файлом с тем же именем в корневом каталоге на диске D, введите:
Заметки
Циклическиe операции FOR
Командой FOR задаётся список команд, которые выполняются с КАЖДЫМ элементом набора.
Набор * пишется внутри IN (. )
Список команд пишется внутри DO (. )
Командная строка выполняет эти команды раз за разом, при этом текущий элемент набора находится в переменной, заданной после %% (назовём ее переменной цикла).
выведет имена и путь ко всем файлам с расширением .txt в папке C:\Users.
* Примеры под спойлером
Для команды For без ключей набором может являться :
1) Маска файлов * (или путь + маска файлов)
- в двойных кавычках, или без них:
IN (*.txt)
Результат: список файлов с расширением .txt в текущем каталоге.
IN (*.txt *.bat)
Результат: список файлов с расширениеми .txt и .bat в текущем каталоге.
IN ("C:\Folder 1\Doc_31-12-*.txt")
Результат: тот же. Но поиск ведется в каталоге C:\Folder 1 (заметьте с пробелом в имени);
имя файла начинается на Doc_31-12-
Прим.: FOR без ключа не умеет выводить список каталогов.
* маска файлов - это набор файлов, заданный с помощью подстановочных знаков * и/или ?
где * - обозначает 0 или больше любых символов в имени файла.
а ? - означает 0 или 1 любой символ в имени файла.
2) Строка
- в двойных кавычках, или без них:
Строкой считается любая последовательность символов, если она не содержит знаков маски * или ?
Смысл цикла здесь в том, чтобы разбить такую строку по пробелам (или знакам табуляции)
и выполнить с каждой подстрокой список команд.
При этом, чтобы не выводились сами кавычки "" мы используем модификатор * ~ (тильда) при раскрытии переменной цикла %%~a
* О других модификаторах переменной цикла можно почитать здесь и здесь.
3) еще есть смешанный тип. Это когда в наборе стоит маска (1-й описанный тип), а через пробел Строка (2 тип). ведет себя вполне ожидаемо, но вряд ли найдет себе применение.
О наборах для FOR с ключем /F далее в нижнем спойлере.
Ключ /F часто используется для построчного разбора файла, т.е.
выведет все строки файла 1.txt, который находится в корне диска C.
UseBackQ (Use back quotes) означает, что набор с двойными кавычками * подразумевает передачу в цикл имени файла.
delims= означает, что в переменную %%a будет записана вся строка (без разделения по пробелу или знаку табуляции, т.к. стандартный разделитель заменен на NULL (пустой символ).
В такой вариации:
tokens=* приводит к тому же результату, что и delims= . Означает прекратить разбивку по разделителю после "0-го" токена, т.е. сразу же.
* Этот вариант необходим для работы с файлом, путь или имя которого содержит пробелы.
Можно было не использовать UseBackQ , тогда команда приняла бы вид:
но такая конструкция восприняла бы пробел в имени как определение нового файла, поэтому UseBackQ более приемлем.
** Примеры под спойлером
В цикле FOR /F вид задаваемого набора зависит от формы кавычек в IN (. ) , а также наличия ключевого слова UseBackQ
Виды наборов для FOR /F:
1) Набор файлов (задание маски недопустимо!)
без UseBackQ - задается без кавычек IN (. )
__ с UseBackQ - может задаваться как в кавычках так и без них. IN (. ) IN (". ")
Функционал: чтение содержимого файла(ов) построчно в переменную цикла!
Принцип работы: источником для разбиения по разделителю (delims) является содержимое файла, заданного внутри IN (. ) или файлов, если они заданы через пробел.
Исключение: принятый по-умолчанию разделитель (пробел и знак табуляции) для этой конструкции цикла не применяется.
А что получится, если установить delims= (возле равно - знак пробела) ?
В выводе на экран командой Echo %%a мы получим содержимое файла, где каждая из строк будет напечатана до первого встретившегося пробела.
.
2) Строка (допускаются практически любые символы)
без UseBackQ - задается с двойными кавычками IN (". ")
__ с UseBackQ - задается с одиночными прямыми кавычками IN ('. ')
3) Команда (сначала выполняется она, а уже ее результаты обрабатываются циклом как строка(-и))
без UseBackQ - задается с одиночными прямыми кавычками IN ('. ')
__ с UseBackQ - задается с одиночными обратными кавычками IN (`. `)
1.1. Чтение файла - Набор файлов
Результат: выведет подряд содержимое двух файлов - 1.txt и 2.txt из каталога c:\users
Прим.: Echo. - с точкой - это обход ошибки, чтобы можно было напечатать пустую строку, точнее строку с пробелами.
1.2. Чтение файла - Набор файлов + UseBackQ
Получаем возможность использовать пробелы.
Результат: выведет содержимое файла 1.txt из каталога c:\folder 1
(заметьте, в имени папки есть пробел).
Результат такой же.
3.1. Команда
Сначала выполняется Dir /AD-L , которая выводит информацию о папках в текущем каталоге.
Вот что попадает под разбор циклу:
Далее цикл разбирает каждую строку по пробелам и табуляции на подстроки (токены).
На примере 1-й строки:
1-й токен (%%a)=29.12.2012 . 2-й токен (%%b)=15:16 . 3-й токен (%%c)= . 4-й токен (%%d)=Favorites
.
Результат через Echo выводится на экран:
Папка Favorites Дата модификации 29.12.2012. Время 15:16
Папка Links Дата модификации 14.01.2013. Время 01:51
. и т.д.
Результат такой же.
Альтернативный вариант нужен с целью, если одна из выполняемых команд требует точно такие же кавычки как и ключевое слово IN (. ).
Дабы не пользоваться символом экранирования, просто применяем другие кавычки.
Отличительной особенностью FOR /F является умение работать через токены * ,
а также поддержка дополнительных ключевых слов:
1) eol - знак комментария в начале строки (1-й символ). Т.е. строки с таким символом не будут обрабатываться. (по умолчанию, знак точки с запятой ; )
2) skip - пропуск определенного кол-ва обрабатываемых строк от начала файла
3) delims - задать другой разделитель(-ли) (по умолчанию, пробел и знак табуляции)
4) tokens - количество получаемых токенов (подстрок) в теле цикла и пределы разбивки по разделителю.
Также можно задать конкретный № токена, который попадет в первую переменную цикла.
5) usebackq - изменение правил использования кавычек внутри IN (. )
Детальную справку можно получить, введя в консоль команду FOR /?
* Токены - это подстроки, которые попадают в переменные цикла %% в каждой из итераций.
Они получаются в результате разбивки строки, заданной в IN (. ), по разделителю, заданному в Delims= (по умолчанию, пробел и знак табуляции).
В отличие, от FOR без ключа, в FOR /F все токены (все подстроки одной строки) попадают сразу В ПЕРВУЮ ИТЕРАЦИЮ цикла.
Они будут распределены по РАЗНЫМ переменным цикла, идущим в алфавитном порядке * , начиная с буквы, заданной после FOR /F %%
Обратите внимание: по умолчанию, цикл выдаёт в результатах только 1-ый токен. Если вам нужно, получить другой, нужно явно указывать модификатор "tokens=xxx".
Максимальное кол-во токенов составляет - 26,
если начальным указать %%a либо %%A (регистр имеет значение)
При этом переход с %%z в %%A не происходит. Остальная часть подстрок опускается.
Можно проверить:
Бывают случаи, когда требуется разбить строку по специфическому разделителю и при этом выполнить одну и ту же команду над каждой из подстрок (токеном). Кол-во токенов неизвестно.
Метод показал Anonymоus в теме Символ переноса строки в переменной окружения
Алгоритм заключается в замене разделителя на пробел с одновременным заключением каждого токена в двойные кавычки. Далее строка разбирается обычным циклом FOR без ключа.
Более универсальные конструкции на основе FOR /F для работы с файлами/папками строятся путем помещения
в IN ('. ') команды, результаты от выполнения которой уж затем обрабатываются циклом.
Чаще всего это команда Dir .
1.2. Чтение файла (сложный пример).
Давайте возьмем сложный пример, и раскусим "крепкий орешек"
Порядок разбора (или "как прибл. будет думать ком. строка"):
1) %~dp0 - означает каталог, где находится батник, например c:\temp\
2) UseBackQ , ага - значит если в IN (. ) ничего нет или двойные кавычки, то это файл и его нужно прочесть.
3) Читаем содержимое файла 1.txt в папке %~dp0, а затем каждую его строку проверяем по правилам. ключевых слов skip=1 tokens=2 delims=/\ eol=
4) Итак, первая строка так и называется "первая строка"
skip=1 - означает пропустить от начала файла 1-у строку,
значит идем дальше:
5) Вторая строка: ";комментарий/кода"
Первый символ - это точка с запятой. А теперь смотрим сюда "eol=пустой символ" .
По умолчанию eol=; и если бы мы не указали пустой EOL, то цикл просто бы пропустил эту строку.
Итак, символ комментария не совпадает с заданным (т.е. он вообще пустой), а значит строчка нам подходит -> проверяем ее дальше:
6) Смотрим какие приняты разделители: delims=/\ (знаки / и \ ), значит
из строки ";комментарий/кода"
мы получим 2 подстроки:
1-й токен - ";комментарий"
2-й токен - "кода"
7) Теперь смотрим сюда tokens=2 - значит, что первой букве цикла нужно присвоить значение 2-го токена.
Первая буква цикла у нас X. Переменная называется %%X
А второй токен - это подстрока "кода"
8) Только теперь мы попадаем в тело цикла: Echo %%X
что означает - вывести на экран текст "кода"
С 3-ей строкой потренируйтесь самостоятельно.
IN (первое, шаг, последнее)
означает математическое перечисление чисел от первого числа (0), до третьего (6), с шагом, указанным вторым числом (2) в наборе IN (. ).
Указанная команда выведет:
Циклические операции. Программа не выдает ни результата, ни ошибки
простенькая задача вроде исходник правильный а вывод с ошибкой то есть, ошибки не какой не.
Добрый день. Вероятность того что команда а и команда б забьет 2,3,4,5 голов
Команда а, сыграла дома 12 матчей забила 17 мячей и пропустила 7 Команда б, сыграла в гостях 12.
Почему команда «dir>test.txt» работает, а команда «ftp /?>test.txt» — нет?
Пробовала без пробелов, что тут еще можно попробовать непонятно Выводит в окно командной строки.
Статья
Здравствуйте люди добрые, помогите пожалуйста, найти следующий статьи очень нужно. .
Особенности, которые распространяются на циклы FOR
0) Если нужно записать в наборе несколько команд , то используем:
а) знаки амперсанда &, если мы хотим записать все в одну строку:
1) Пустые строки в содержимом файлов и выводе команд игнорируются.
2) Если предполагается получение пустого токена, остальные токены смещаются.
К примеру,
имеем файл с содержимым:
3) Все специальные (служебные) символы необходимо экранировать (предварять птичкой ^).
Это такие символы, как | = ^ < >&. А также % ! - если они используются не для раскрытия переменной, кроме случая с !, когда не включено удаленное расширение переменных.
Сюда же входит знак кавычки, которая соответствует форме кавычки, применяемой для определения вида набора.
4) Регистр переменной цикла имеет значение.
5) Изменить вручную значение переменной цикла нельзя. Например, set %%A=param не даст эффекта.
6) После выхода из цикла переменная цикла уничтожается.
7) Внутри цикла нельзя использовать комментарии вида :: (будет критическая ошибка и "вылет" из пакетного файла)
Вместо этого используем Rem .
8) Внутри цикла нельзя использовать метки (будет такой же "вылет").
9) Тем не менее из цикла можно безвозвратно выйти на метку Goto metka
а также выйти в подпрограмму и вернутся снова в цикл точно в ту же позицию через команду Call :metka
В конце подпрограммы должна стоять команда Exit /B
10) Для получения значения обычной переменной внутри цикла в случае, если этой переменной было присвоено новое значение внутри тела этого же цикла, необходимо раскрывать переменную через знаки восклицания !variant! - это называется отложенное расширение переменных.
Перед использованием такого способа, его нужно включить, задав в начале пакетного файла команду:
Иначе, если использовать обычный способ раскрытия %variant% , мы получим значение переменной, присвоенное ей еще до входа в цикл.
Точно таким же образом (через ! ) необходимо раскрывать переменную времени внутри цикла, т.к. иначе для цикла время "замерзает".
Происходит это потому, что в цикл попадает т.н. "слепок" переменных среды. И работа с ними через % происходит уже как с копией данных, а не актуальными значениями.
11) Когда после IN указана команда, под разбор цикла попадают такие потоки:
1-й поток (StdOut)
с 3-го по 9-й поток (User Stream)
При этом 2-й поток (StdError) отображается на экране сразу после выполнения указанной в цикле команды в IN (. )
2-й поток можно занулить, обычным способом, не забыв экран:
Собственно, чтобы наоборот, обрабатывать 2-й поток вместо первого, можно воспользоваться следующей конструкцией:
12) При запуске цикла из консоли (cmd.exe) переменные цикла нужно указывать без удвоения знака процента %a .
Это же правило касается вызова цикла через Shell-подобные команды на других языках программирования.
13) Переменную цикла нельзя раскрыть внутри строки модификаторов другого цикла:
for /f %%q in (quote) do for /f "usebackq tokens=1* delims= %%q " %%a in ("%~dp01.txt") do echo %%a%%b
В этой статье мы рассмотрим, как использовать конструкцию for в командной строке для перебора значений и файлов. Все примеры в статье я буду приводить с учетом, что код будет выполнятся в теле сценария, который, в свою очередь будет запускаться из консоли командной строки.
Лично я, сперва добавляю в переменную окружения PATH путь к каталогу, в котором находится сценарий:
set %PATH%;путь_к _каталогу
После этого я просто ввожу в консольном окне имя сценария, например, test.bat. Помните, что путь будет храниться в переменной окружения лишь в пределах текущего окна командной строки.
Примеры
Чтобы использовать для в пакетном файле, используйте следующий синтаксис:
Чтобы отобразить содержимое всех файлов в текущем каталоге с расширением .doc или .txt с помощью заменяемой переменной % f, введите:
Чтобы выполнить синтаксический анализ файла, игнорируя строки с комментариями, введите:
Эта команда анализирует каждую строку в myfile.txt. Он игнорирует строки, начинающиеся с точки с запятой, и передает второй и третий токены из каждой строки в тело для тела (маркеры разделяются запятыми или пробелами). Тело инструкции for ссылается на % i , чтобы получить второй токен % j для получения третьего маркера, и % k , чтобы получить все остальные токены. Если указываемые имена файлов содержат пробелы, заключите его в кавычки (например, имя файла). Чтобы использовать кавычки, необходимо использовать усебаккк. В противном случае кавычки будут интерпретированы как определение литеральной строки для синтаксического анализа.
% i явно объявлен в операторе for . % j и % k неявно объявляются с помощью токенов =. Токены можно использовать для указания до 26 маркеров, при условии что не будет пытаться объявить переменную выше буквы Z или z.
Чтобы проанализировать выходные данные команды, заставив в скобки заданную команду, введите:
Цикл cmd for – обработка текста
Для обработки текста или содержимого текстового файла применяется следующая конструкция:
for /f ["параметры"] %%переменная in (источник) do (оператор)
Тут “параметры” задают параметры поиска, мы их рассмотрим ниже, “источник” – тут нужно указать или путь к текстовому файлу, или текст, или вывод команд, “оператор” – тут собственно, находятся команды для обработки текста. Сам текст можно хранить в переменной, имя которой мы зададим в качестве источника.
Значение “параметры” может быть одним или комбинацией таких параметров:
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, в котором прописаны такие строки:
Попробуем выполнить такой код:
На выходе функция echo выведет:
Бинго, теперь нам вывело все строки полностью, кроме строки с комментариями, так как мы указали в параметре tokens значение *, то есть все. В предыдущем примере сценарий принимал пробелы как разделители.
Теперь запишем в текстовый файл такой текст:
Ukraina-Kijev-grivna-salo
Rossija-Moskva-rubl-bliny
Belorussija-Minsk-zajec-kartoska
Chechija-Praga-krona-pivo
@echo off for /f "tokens=1-4 delims=-" %%A in (d:\work\test.txt) do ( (@echo 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
Я специально вставил между строк пустую (echo.) что бы было лучше видеть.
Осталось рассмотреть пример с параметром usebackq:
@echo off set get_dir=d:\work\hello.txt for /f "usebackq" %%A in (`echo Hello, Wold ^>^> "%get_dir%"`) do echo OK type %get_dir% set get_dir=
В данном случаем мы выполняем команду: записываем фразу “Hello, Wold” в текстовый файл, путь к которому содержится в переменной get_dir. В конце выводим содержимое файла и удаляем переменную.
Знаю, знаю, мало примеров, ничего, я исправлюсь…
Спасибо за внимание. Автор блога Владимир Баталий
Выполняет указанную команду для каждого файла в наборе файлов.
Синтаксис
Параметры
Параметр | Описание |
---|---|
/a | Сокращает выходные данные сравнения ASCII. Вместо отображения всех строк, которые отличаются, FC отображает только первую и последнюю строку для каждого набора различий. |
/b | Сравнивает два файла в двоичном режиме, байт по байтам и не пытается повторно синхронизировать файлы после обнаружения несоответствия. Этот режим используется по умолчанию для сравнения файлов со следующими расширениями: .exe, com, .sys, obj, lib или bin. |
/C | Игнорирует регистр букв. |
/l | Сравнивает файлы в режиме ASCII, построчно и пытается повторно синхронизировать файлы после обнаружения несоответствия. Этот режим используется по умолчанию для сравнения файлов, за исключением файлов со следующими расширениями файлов: .exe, com, .sys, obj, lib или bin. |
/лб | Задает число строк для внутреннего буфера строки равным N. Длина буфера строки по умолчанию составляет 100 строк. Если сравниваемые файлы содержат более 100 последовательных строк разной, FC отменяет сравнение. |
/n | Отображает номера строк во время сравнения ASCII. |
"/OFF" [строка] | Не пропускает файлы с установленным атрибутом "вне сети". |
/t | Предотвращает преобразование табуляций в пробелы с FC . Поведение по умолчанию заключается в том, что символы табуляции обрабатываются как пробелы, а для каждой восьмой позиции — остановка. |
/U | Сравнивает файлы как текстовые файлы в Юникоде. |
/W | Сжимает пробелы (т. е. знаки табуляции и пробелы) во время сравнения. Если строка содержит несколько последовательных пробелов или знаков табуляции, /w рассматривает эти символы как один пробел. При использовании параметра /wFC игнорирует пробелы в начале и конце строки. |
/ | Указывает число последовательных строк, которые должны совпадать после несоответствия, прежде чем FC считает файлы для повторной синхронизации. Если число совпадающих строк в файлах меньше nnnn, FC отображает соответствующие строки в виде различий. Значение по умолчанию — 2. |
[:][] | Указывает расположение и имя первого файла или набора сравниваемых файлов. требуется имя_файла1 . |
[:][] | Указывает расположение и имя второго файла или набора сравниваемых файлов. требуется имя_файла2 . |
/? | Отображение справки в командной строке. |
Комментарии
Эта команда имплеметед by c:\WINDOWS\fc.exe. Эту команду можно использовать в PowerShell, но не забудьте проделать полный исполняемый файл (fc.exe), так как "FC" также является псевдонимом для формата Custom.
При использовании FC для сравнения в ASCII, FC отображает различия между двумя файлами в следующем порядке:
Имя первого файла
Строки из имя_файла1 , отличные от файлов
Первая строка для сопоставления в обоих файлах
Имя второго файла
Строки из имя_файла2 различаются
Первая строка для сопоставления
/b выводит несоответствия, найденные во время двоичного сравнения в следующем синтаксисе:
Значение XXXXXXXX задает относительный шестнадцатеричный адрес для пары байтов, измеряемой от начала файла. Адреса начинаются с 00000000. Шестнадцатеричные значения для YY и ZZ представляют несовпадающие байты из имя_файла1 и имя_файла2соответственно.
В имя_файла1 и имя_файла2можно использовать подстановочные знаки ( * и ?). Если в имя_файла1используется подстановочный знак, FC сравнивает все указанные файлы с файлом или набором файлов, указанным параметром имя_файла2. Если в параметре имя_файла2используется подстановочный знак, то FC использует соответствующее значение из имя_файла1.
Resynch failed. Files are too different.
При сравнении двоичных файлов, размер которых превышает объем доступной памяти, FC полностью сравнивает оба файла, наполняя участки памяти следующими частями от диска. Результат будет таким же, как и для файлов, которые полностью умещаются в памяти.
Параметры
Параметр | Описание |
---|---|
Обязательный элемент. Представляет заменяемый параметр. Используйте один знак процента ( % ), чтобы выполнить команду for в командной строке. Используйте двойные знаки процента ( %% ) для выполнения команды for в пакетном файле. Переменные чувствительны к регистру и должны быть представлены в алфавитном значении, например % a, % bили % c. | |
( ) | Обязательный элемент. Указывает один или несколько файлов, каталогов или текстовых строк или диапазон значений, по которым должна выполняться команда. Необходимо поставить скобки. |
Обязательный элемент. Указывает команду, которую нужно выполнить для каждого файла, каталога или текстовой строки, или диапазон значений, включенных в набор. | |
Задает параметры командной строки, которые необходимо использовать с указанной командой. | |
/? | Отображение справки в командной строке. |
Комментарии
Эту команду можно использовать в пакетном файле или непосредственно в командной строке.
К команде for применяются следующие атрибуты:
Эта команда заменяет % variable или %% variable с каждой текстовой строкой в указанном наборе до тех пор, пока указанная команда не обработает все файлы.
В именах переменных учитывается регистр, глобальная и не более 52 может быть активна за один раз.
Чтобы избежать путаницы с параметрами пакетной службы, можно использовать любой символ для переменной , %0 %9 Кроме цифр от 0 до 9. Для простых пакетных файлов один символ, например %%f , будет работать.
Можно использовать несколько значений для переменной в сложных пакетных файлах для различения разных заменяемых переменных.
Параметр Set может представлять одну группу файлов или несколько групп файлов. Для указания набора файлов можно использовать подстановочные знаки ( * и ?). Ниже приведены допустимые наборы файлов.
При использовании этой команды первое значение в Set заменяет % variable или %% variable , а затем заданная команда обрабатывает это значение. Это будет продолжаться до тех пор, пока не будут обработаны все файлы (или группы файлов), соответствующие заданному значению .
Если расширения команд включены (по умолчанию), поддерживаются следующие дополнительные формы для :
Только каталоги: Если параметр SET содержит подстановочные знаки ( * или ?), указанная команда выполняется для каждого каталога (вместо набора файлов в указанном каталоге), соответствующего заданному набору. Синтаксис:
Рекурсивно: Просматривает дерево каталогов, корневое в папке Drive:path , и выполняет инструкцию for в каждом каталоге дерева. Если после /rне указан каталог, в качестве корневого каталога используется текущий каталог. Если параметр задан только как одиночная точка (.), он только перечисляет дерево каталогов. Синтаксис:
Итерация и синтаксический анализ файлов: Используйте синтаксический анализ файлов для обработки выходных данных команды, строк и содержимого файлов. Используйте итерационные переменные для определения содержимого или строк, которые необходимо проверить, и используйте различные параметры парсингкэйвордс для дальнейшего изменения разбора. Используйте параметр токена парсингкэйвордс , чтобы указать, какие токены должны передаваться как итерационные переменные. Обратите внимание, что при использовании без параметра token функция /f будет проверять только первый токен.
Анализ файлов состоит из чтения выходных данных, строки или содержимого файла, а затем разбивает их на отдельные строки текста и анализирует каждую строку в ноль или более маркеров. Затем цикл for вызывается с итерационным значением переменной, заданным для маркера. По умолчанию /f передает первый пустой отделенный маркер из каждой строки каждого файла. Пустые строки пропускаются.
Аргумент Set указывает одно или несколько имен файлов. Каждый файл открывается, считывается и обрабатывается перед переходом к следующему файлу в наборе. Чтобы переопределить поведение при синтаксическом анализе по умолчанию, укажите парсингкэйвордс. Это строка в кавычках, содержащая одно или несколько ключевых слов для указания различных параметров анализа.
Если используется параметр усебаккк , используйте один из следующих синтаксисов:
В следующей таблице перечислены ключевые слова синтаксического анализа, которые можно использовать для парсингкэйвордс.
Подстановка переменных: В следующей таблице перечислены необязательные синтаксисы (для любой переменной I).
Переменная с модификатором | Описание |
---|---|
%~I | %I Развертывает, удаляя все окружающие кавычки. |
%~fI | %I Разворачивается до полного имени пути. |
%~dI | %I Разворачивается только буква диска. |
%~pI | %I Разворачивается только по пути. |
%~nI | %I Разворачивается только на имя файла. |
%~xI | %I Разворачивается только на расширение имени файла. |
%~sI | Разворачивает путь, чтобы содержать только короткие имена. |
%~aI | %I Разворачивается в файловые атрибуты файла. |
%~tI | %I Разворачивается до даты и времени файла. |
%~zI | %I Разворачивается до размера файла. |
%~$PATH:I | Выполняет поиск в каталогах, перечисленных в переменной среды PATH, и раскрывает %I полное имя первого найденного каталога. Если имя переменной среды не определено или файл не найден при поиске, этот модификатор разворачивается до пустой строки. |
В следующей таблице перечислены сочетания модификаторов, которые можно использовать для получения составных результатов.
Переменная с объединенными модификаторами | Описание |
---|---|
%~dpI | %I Разворачивается только буква диска и путь. |
%~nxI | %I Развертывает только имя файла и расширение. |
%~fsI | %I Разворачивается в полное имя пути с краткими именами. |
%~dp$PATH:I | Выполняет поиск в каталогах, указанных в переменной среды PATH для %I , и разворачивается на букву диска и путь к первой найденной папке. |
%~ftzaI | %I Разворачивается в выходную строку, похожую на dir. |
В приведенных выше примерах можно заменить %I и Path другими допустимыми значениями. Допустимое имя переменной завершает%~ синтаксис.
Используя имена переменных в верхнем регистре, например %I , можно сделать код более читаемым и избежать путаницы с модификаторами, которые не чувствительны к регистру.
Синтаксический анализ строки: Логику синтаксического анализа можно использовать for /f в непосредственной строке путем заключения в двойные кавычки (без усебаккк) или в одинарные кавычки (with усебаккк), например (MyString) или (' MyString '). рассматривается как одна строка входных данных из файла. При синтаксическом анализе в двойных кавычках символы команд (например, \ & | > < ^ ) обрабатываются как обычные символы.
Синтаксический анализ выходных данных: Можно использовать for /f команду для анализа выходных данных команды путем помещения обратной кавычки между круглыми скобками. Он рассматривается как Командная строка, которая передается дочернему Cmd.exeу. Выходные данные фиксируются в памяти и анализируются так, как если бы это был файл.
Командная строка for – работа с файлами
Для групповой работы с файлами используется следующий синтаксис цикла for командной строки:
for %переменная in (набор_файлов) do (оператор)
Базовый параметр тут переменная набор_файлов, которая может содержать:
- отдельный файл, например, my_file.txt
- групповой набор документов, заданный через шаблон, например, *.txt
- список файлов, который разделяется пробелами, причем каждый элемент списка тоже может содержать шаблон, например, my_file.txt *.doc my*.avi
Стоит учитывать тот факт, что если не указывать путь к файлу, то поиск будет производиться в текущем каталоге – в том каталоге, из которого производится запуск сценария.
В следующем примере происходит вывод всех файлов из каталога d:\work\ с расширением .txt:
@echo off for %%В in (d:\work\*.txt) do (echo %%В)
Тут B является переменной инициализации, при каждой итерации ей будет присвоено путь, имя и расширение найденного текстового документа, а функция ЭХО сразу выведет информацию на экран. Потом снова, переменной B будет присвоено новое имя и снова произойдет вывод данных. Сам цикл работает до тех пор, пока не будут найдены все значения, заданные в условии.
Естественно, можно задать условие для вывода всех файлов с расширениями, например, .txt, .avi и .pdf.
@echo off set work_dir=d:\work for %%B in (%work_dir%\*.txt %work_dir%\*.avi %work_dir%\*.pdf) do (echo %%B) set work_dir=
В данном случае переменная work_dir содержит путь к папке d:\work, в цикле командной строки for мы добавляем к переменной нужные расширения. В конце сценария происходит удаление переменной work_dir.
Также стоит понимать, что вместо одного оператора (в данном случае эхо) можно прописать несколько, сгруппировав их символом &. То есть, данный цикл позволяет в групповом порядке обработать одним махом несколько файлов. Только не забывайте, что при формировании группы их стоит заключить в круглые скобки. Например:
Можно попробовать получить список имен файлов и их размер:
@echo off for %%B in (%SystemRoot%\*.txt) do (echo %%B %%~zB)
Конструкция ~z позволяет получить размер файла в байтах.
Что бы использовать сразу цикл в командной строке, стоит вместо двух символов % прописывать один, например:
for %B in (%SystemRoot%\*.txt) do (echo %B %%~zB)
Спасибо за внимание. Автор блога Владимир Баталий
В этой статье мы рассмотри как используется цикл командной строки for для обработки текстовых строк и файлов. Тут будет фигурировать ключ /f, который меняет логику работы цикла командной строи (cmd) for и позволяет производить разбор любого текста по полочкам, так сказать.
Командная строка for – перебор значений
Для перебора значений используется следующий синтаксис:
for /L %%переменная in (начало, шаг, конец) do (оператор)
Ключ /L говорит о том, что происходит перебор данных, далее следует имя переменной, в которую эти данные будут записываться. В круглых скобках нужно через запятую указать три параметра:
- начало – начальное значение
- шаг – тут мы указывает, насколько нужно увеличивать или уменьшать начальное значение при каждой итерации. То есть, если параметр содержит отрицательное число, то будет происходить уменьшение, иначе – увеличение параметра “начало”.
- конец – тут нужно указать конечное значение, именно оно и будет определять, завершать цикл или нет. То есть, при каждой итерации происходит сравнивание начального и конечного параметра.
Давайте рассмотрим такой пример:
@echo off for /L %%B in (0,1,5) do echo %%B echo. for /L %%B in (5,-1,0) do echo %%B
В данном сценарии используются два цикла for командной строки, первый задает диапазон цифр от 0 до 5 с шагом 1, второй – диапазон цифр от 5 до 0 с шагом -1. То есть, прямой и обратный порядок. Функция ЭХО будет в виде списка выводить содержимое переменной B. Команда “echo.” вставляем между списками пустую строку.
Теперь попробуем найти сумму чисел от 0 до 100:
@echo off set summ=0 for /L %%B in (0,1,100) do set/A summ+=%%B echo %summ% set summ=
Сначала мы отключаем вывод эхо-отображений. Потом мы объявляем переменную summ с помощью ключевого слова set и присваиваем ей ноль. Далее в цикле for задаем начальное значение в 0, шаг в 1 и конечное значение в 100. Суммирование происходит в строке set/A summ+=%%B, тут к содержимому переменной summ будет добавляться содержимое переменной %%B. В конце мы выводим конечный результат и удаляем из окружения summ.
Теперь давайте посмотрим, как будет выглядеть код для нахождения факториала числа 5:
@echo off set fact=1 for /L %%B in (5,-1,1) do set/A fact*=%%B echo %fact% set fact=
Тут практически тот же самый синтаксис, за исключением того, что мы задали отрицательный шаг и использовали оператор *=.
Хорошо, теперь усложним задачу: найдем сумму чисел от 0 до 10, исключив из расчета числа 5, 7 и 9:
@echo off set summ=0 for /L %%B in (0,1,10) do (if "%%B" neq "5" (if "%%B" neq "7" (if "%%B" neq "9" set/A summ+=%%B))) echo %summ% set summ=
Как видим, для проверки условия мы использовали условный оператор if. К сожалению, в командной строке нет логических операторов тип “ИЛИ” и “И”, как например, в языках vbscript и jscript, поэтому нам пришлось создавать вложенные операторы if. В результате, мы получили число 34. Также обратите внимание на оператор “neq” – проверка условия типа “НЕ РАВНО”.
Читайте также: