В этой статье мы рассмотрим, как использовать конструкцию for в командной строке для перебора значений и файлов. Все примеры в статье я буду приводить с учетом, что код будет выполнятся в теле сценария, который, в свою очередь будет запускаться из консоли командной строки.
Лично я, сперва добавляю в переменную окружения PATH путь к каталогу, в котором находится сценарий:
set%PATH%;путь_к _каталогу |
После этого я просто ввожу в консольном окне имя сценария, например, test.bat. Помните, что путь будет храниться в переменной окружения лишь в пределах текущего окна командной строки.
Командная строка 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” – проверка условия типа “НЕ РАВНО”.
Командная строка 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) |