Как сделать цикл в cmd
Перейти к содержимому

Как сделать цикл в cmd

  • автор:

Как организовать цикл в 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, работа с файлами и значениями

Урок 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, работа с папками и подпапками

Урок 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, обработка текстовых строк

Урок 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. В конце выводим содержимое файла и удаляем переменную.

Знаю, знаю, мало примеров, ничего, я исправлюсь…

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *