Как организовать цикл в bat или cmd файле
Бывают ситуации, когда нужно выполнять какую-нибудь команду несколько раз, причем количество запусков заранее известно. Для этого можно организовать цикл с помощью команды FOR. Вот что написано в справке по этой команде:
FOR %переменная IN (набор) DO команда [параметры] %переменная Подставляемый параметр. (набор) Набор, состоящий из одного или нескольких файлов. Допускается использование подстановочных знаков. команда Команда, которую следует выполнить для каждого файла. параметры Параметры и ключи для указанной команды. В пакетных файлах для команды FOR используется запись %%переменная вместо %переменная. Имена переменных учитывают регистр букв (%i отличается от %I).
полную справку можно получить, вызвав FOR /?
Итак, нам нужен цикл с определенным количеством итераций, это делается с помощью ключа /L
FOR /L %переменная IN (начало,шаг,конец) DO команда [параметры] Набор раскрывается в последовательность чисел с заданными началом, концом и шагом приращения. Так, набор (1,1,5) раскрывается в (1 2 3 4 5), а набор (5,-1,1) заменяется на (5 4 3 2 1)
Например, мне недавно понадобилось пропинговать 3 подсеть, cmd файл с командой выглядит так:
FOR /L %%i IN (1,1,255) DO ping 192.168.3.%%i >>ping.log
Урок 7 по CMD — цикл for, работа с файлами и значениями
Командная строка
Автор Coding На чтение 6 мин Просмотров 11к. Опубликовано 19.08.2013
В этой статье мы рассмотрим, как использовать конструкцию for в командной строке для перебора значений и файлов. Все примеры в статье я буду приводить с учетом, что код будет выполнятся в теле сценария, который, в свою очередь будет запускаться из консоли командной строки.
Лично я, сперва добавляю в переменную окружения PATH путь к каталогу, в котором находится сценарий:
set%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
@echo offfor /L %%B in (0,1,5) do echo %%Becho.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=
@echo offset summ=0for /L %%B in (0,1,100) do set/A summ+=%%Becho %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=
@echo offset fact=1for /L %%B in (5,-1,1) do set/A fact*=%%Becho %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=
@echo offset summ=0for /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%%В)
@echo offfor %%В 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=
@echo offset work_dir=d:workfor %%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)
@echo offfor %%B in (%SystemRoot%*.txt) do (echo %%B %%~zB)
Конструкция ~z позволяет получить размер файла в байтах.
Что бы использовать сразу цикл в командной строке, стоит вместо двух символов % прописывать один, например:
for %B in (%SystemRoot%\*.txt) do (echo %B %%~zB)
for %B in (%SystemRoot%*.txt) do (echo %B %%~zB)
Урок 8 по CMD — цикл for, работа с папками и подпапками
Командная строка
Автор Coding На чтение 4 мин Просмотров 4.4к. Опубликовано 19.08.2013
В этой статье мы рассмотрим как используется цикл for в командной строке (cmd) для групповой работы с каталогами. Как уже упоминалось, логику работы cmd цикла можно менять с помощью ключей, так, для обработки каталогов применяется ключ /D.
Стоит учитывать тот факт, что в данном случаем мы можем обработать все входящие на один уровень папки для заданного каталога, но не дальше, для обработки полный структуры, используется другой ключ — /R, примеры работы с которым мы рассмотрим по ходу статьи.
Фактически, с помощью цикла cmd for можно получить слепок всего дерева каталогов для заданного диска, и в групповом порядке их обработать.
Cmd цикл for – обработка корневых и вложенных папок
Для работы с каталогами цикл принимает следующий вид:
for /D %%переменная in (набор_каталогов) do (оператор)
Фактически, тут логика работы аналогична той, что используется при работе с файлами. Переменная набор_каталогов содержит путь к папке, содержимое которой нужно обработать. Только помните, что в данном случае мы получаем не список файлов, а каталогов. Мы также можем указать шаблон для поиска:
@echo off for /d %%B in (%SystemRoot%\*) do echo %%B
@echo offfor /d %%B in (%SystemRoot%*) do echo %%B
В данном случае функция echo выведет список всех папок, которые есть в системном каталоге (путь к нему, хранится в переменной (%SystemRoot%). Или такой вариант:
@echo off for /d %%B in (%SystemRoot%S\*) do echo %%B
@echo offfor /d %%B in (%SystemRoot%S*) do echo %%B
Тут мы получим список лишь тех папок, имена которых начинаются на S.
Как и с файлами, можно указать список, используя в качестве разделителя пробел:
@echo off for /D %%B in (%SystemRoot%\* %TEMP%\*)do echo %%B
@echo offfor /D %%B in (%SystemRoot%* %TEMP%*) do echo %%B
Тут происходит вывод всех папок из системной и временной папки (переменная окружения %TEMP%).
А вот такая запись:
for /d %%B in (%SystemRoot%) do echo %%B
for /d %%B in (%SystemRoot%) do echo %%B
выведет путь к системному каталогу, заданному в переменной окружения %SystemRoot%. Аналогичный результат можно получить прописав:
echo %SystemRoot%
set SystemRoot
в первом случае мы используем функцию echo, а во втором ключевое слово set.
Можно совмещать различные вариации цикла cmd (командной строки), так, можно попробовать получить список всех заданных файлов, которые есть во вложенных каталогах текущей папки, например:
@echo off set work_dir=d:\work for /d %%B in(%work_dir%\*) do ( for %%C in ("%%B*\.txt") do echo %%C) set work_dir=
@echo offset work_dir=d:workfor /d %%B in (%work_dir%*) do (for %%C in («%%B*.txt») do echo %%C)set work_dir=
В данном примере вначале сценария создается переменная work_dir, который присваивается путь d:\work. Далее следует cmd цикл с ключом /d. Переменная B будет хранить пути ко всем вложенным каталога папки d:work. При нахождении вложенной папки идет обработка нового цикла cmd, который уже отвечает за поиск текстовых файлов в найденном подкаталоге. Результат как всегда выводится с помощью функции echo. В конце сценария мы удаляем переменную work_dir из переменной среды.
Как вы уже заметили, ключ /d в позволяет получить список вложенных каталогов с одним уровнем, но не позволяет получить полную структуру всех вложенных папок или файлов.
Cmd цикл for – обработка полной структуры
Для решения этой задачи, используется следующий синтаксис:
for /R [путь] %%переменная in (набор_файлов) do (оператор)
Видим, что тут уже фигурирует ключ R, после которого можно указать путь к папке или диску, структуру которого надо обработать. Если не указывать путь, то произойдет обработка текущей папки. Как и прежде, перед ключевым словом in нужно прописать переменную инициализации, а переменная набор_файлов может хранить имя файла или их список, заданный с помощь шаблона или через пробел:
@echo off for /R %SystemRoot% %%B in (*.vbs *.js) do echo %%B
@echo offfor /R %SystemRoot% %%B in (*.vbs *.js) do echo %%B
В данном случае происходит поиск файлов с расширением .vbs и .js во всей структуре системного каталога, заданного переменной окружения SystemRoot.
Можно даже извлечь список всех вложенных каталогов для заданной структуры:
@echo off for /R %SystemRoot%/d %%B in (*) do echo %%B
@echo offfor /R %SystemRoot% /d %%B in (*) do echo %%B
В данном случае, мы использовали оба ключа /R и /D, а символ звездочки указывает на то, что нужно извлечь список абсолютно всех вложенных папок.
Урок 9 по CMD — цикл for, обработка текстовых строк
Командная строка
Автор Coding На чтение 5 мин Просмотров 4.4к. Опубликовано 19.08.2013
В этой статье мы рассмотри как используется цикл командной строки for для обработки текстовых строк и файлов. Тут будет фигурировать ключ /f, который меняет логику работы цикла командной строи (cmd) for и позволяет производить разбор любого текста по полочкам, так сказать.
Цикл cmd for – обработка текста
Для обработки текста или содержимого текстового файла применяется следующая конструкция:
for /f [«параметры»] %%переменная in (источник) do (оператор)
Тут “параметры” задают параметры поиска, мы их рассмотрим ниже, “источник” – тут нужно указать или путь к текстовому файлу, или текст, или вывод команд, “оператор” – тут собственно, находятся команды для обработки текста. Сам текст можно хранить в переменной, имя которой мы зададим в качестве источника.
Значение “параметры” может быть одним или комбинацией таких параметров:
eol – позволяет задать признак концевого комментария (end-of-line comment character). Весь текст, что будет находиться после него, будет приниматься за комментарий, например,“eol=#” – тут символ # является признаком концевого комментария. Собственно, комментарий не будет обрабатываться.
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, в котором прописаны такие строки:
100 200 300
#это комментарий
400 500 600
10; 20; 30;
Попробуем выполнить такой код:
@echo off for /F "eol=#" %%A in(d:\work\test.txt) do echo %%A
@echo offfor /F «eol=#» %%A in (d:worktest.txt) do echo %%A
На выходе функция echo выведет:
Как видим, строка с комментарием не вывелась, но и остальные строки вывелись не полностью, что бы это исправить, напишем так:
@echo off for /F "eol=# tokens=*" %%A in(d:\work\test.txt) do echo %%A
@echo offfor /F «eol=# tokens=*» %%A in (d:worktest.txt) do echo %%A
Бинго, теперь нам вывело все строки полностью, кроме строки с комментариями, так как мы указали в параметре 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.)
@echo offfor /f «tokens=1-4 delims=-» %%A in (d:worktest.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=
@echo offset get_dir=d:workhello.txtfor /f «usebackq» %%A in (`echo Hello, Wold ^>^> «%get_dir%»`) do echo OKtype %get_dir%set get_dir=
В данном случаем мы выполняем команду: записываем фразу “Hello, Wold” в текстовый файл, путь к которому содержится в переменной get_dir. В конце выводим содержимое файла и удаляем переменную.
Знаю, знаю, мало примеров, ничего, я исправлюсь…