betacode

Циклы в языке сценариев Batch

  1. Обзор цикла в языке Batch
  2. Цикл for (По умолчанию)
  3. For /R
  4. For /D
  5. For /L
  6. For /F

1. Обзор цикла в языке Batch

Стандартные разделители (Standard Delimiter).
  • Пробел (space)
  • Запятая ( , )
  • Точка с запятой ( ; )
  • Знак TAB

2. Цикл for (По умолчанию)

Цикл For по умолчаниюю языка Batch используется для повторения списка файлов.
Синтаксис:
@rem set_of_files -  Set of Files
@rem Files separated by standard delimiters.
@rem The parameter name 'variable' must be 1 character
FOR %%variable IN ( set_of_files ) DO command

@rem Hoặc:
FOR %%parameter IN ( set_of_files ) DO  (
     command
)
Например скопировать некоторые файлы в папку (Заметьте файлы должны быть скопированы и папка должна быть на одном диске).
copyFiles.bat
@echo off
@rem Copy to same Disk

FOR %%f IN (E:\test\file1.data  E:\test\file2.txt) DO  (
   echo Copying %%f
   copy  %%f E:\backup
)
pause
Другие примеры:
@rem The delimiter is a semicolon (;)
FOR %%f IN ("E:\my dir\file1.data" ; E:\test\file2.txt) DO copy %%f E:\backup

@rem The delimiter is a comma ( , )
FOR %%f IN ("E:\my dir\file1.data" , E:\test\file2.txt) DO copy %%f E:\backup

@rem The delimiter is a space.
FOR %%f IN ("E:\my dir\file1.data" E:\test\file2.txt) DO copy %%f E:\backup

3. For /R

Цикл FOR /R используется для повторения на списках файлов. Включая файлы в подпапках,.. Называется рекурсией (Recurse).
Синтаксис:
FOR /R [path] %%variable IN ( set_of_file_filters ) DO command

@rem Or:
FOR /R [path] %%variable IN ( set_of_file_filters ) DO (
   command
)
  • [path] : Данный параметр является корневой папкой. Если нет данного параметра"папка включает выполняющийся сценарий файла" или "текущая папка" будет считаться корневой папкой.
  • set_of_file_filters : Список фильтров файлов. Напирмер *.txt , *.bat, ... Или точка ( . ) значит все.
  • variable: Является названием переменной и должна иметь 1 единственный символ.
Пример ниже распечатывает список всех файлов *.txt или *.log в папке C:/Windows/System32 (Поиск включает и в подпапках,..)
forR_example1.bat
@echo off
FOR /R "C:\Windows\System32" %%f IN (*.txt *.log) DO  (
   echo %%f
)
pause
Пример ниже распечатывает все файлы C:/Windows/System32 (Влкючая файлы в подпапках,...)
forR_example2.bat
@echo off 
FOR /R "C:\Windows\System32" %%f IN ( . ) DO  ( 
   echo %%f
)
pause

4. For /D

Цикл FOR /D используется для загрузки списка папок, которые являются подпапками текущей папки.
Синтаксис:
FOR /D [/r] %%variable IN ( set_of_directory_filters ) DO command

@rem Or:
FOR /D [/r] %%parameter IN ( set_of_directory_filters ) DO  (
    command
)
  • set_of_directory_filters : Список фильтров папок (directory filter) как en*, fr*,.. разделены стандартным разделителем (Standard Delimiter).
  • [/r]: Это параметр рекурсии (Recurse) и необязателен, если имеется данный параметр подпапки,.. будут участвовать в цикле.
  • variable: Является названием переменной и должна иметь 1 единственный символ.
Пример: Перечислить список подпапок C:/Windows.
forD_example1.bat
@echo off
C:
cd C:/Windows

FOR /D %%d IN ( * ) DO  (
   echo %%d
)
pause
Пример: Перечислить подпапки C:/Windows с названиями начинающимся на "en" или"fr"
forD_example2.bat
@echo off
C:
cd C:/Windows

FOR /D /r %%d IN (en* fr*) DO  (
   echo %%d
)
pause

5. For /L

Цикл For /L используется для загрузки на ряде цифр (range of numbers).
Синтаксис:
FOR /L %%variable IN (start, step, end) DO command

@rem Or:
FOR /L %%variable IN (start, step, end) DO  (
     command
)
  • start: Первое значение переменной
  • step: После каждого повтора (iteration) значение переменной будет прибавлять 'step'.
  • end: Последнее значение.
Пример:
forL_example1.bat
@echo off 
FOR /L %%d IN (1 2 8 ) DO  (
   echo %%d
)
pause
forL_example2.bat
@echo off 
FOR /L %%d IN (20 -2 5 ) DO  (
   echo %%d
)
pause

6. For /F

Цикл For /F является сложным циклом, но сильным. Он читает содержание файла или несколько файлов. После анализирует содержание файлов. Содержание фала является текстом, оно будет разделено на несколько маленьких текстов, каждый отрывок текста называетя Token. Правило по умолчанию для разделения основано на пробелах (white space). Но вы можете кастомизировать правило разделения с помощью параметра ["delims=xxx"].
Цикл For /F так же используется для анализа содержания строки (string), или для выполнения набора команд.
Синтаксис:
FOR /F ["options"] %%variable IN ( set_of_filenames ) DO command

FOR /F ["options"] %%variable IN ( set_of_filenames ) DO (
     command
)
FOR /F ["options"] %%variable IN ("Text string to process") DO command
FOR /F ["options"] %%variable IN ("Text string to process") DO ( 
     command
)
  • set_of_filenames: Список из одного или нескольких файлов.
  • options: Опции, например: "delims=, tokens=1,2,4"
Опция
Описание
delims=xxx
Символы разделителя (delimiter character(s)). По умолчанию это пробел (space)
skip=n
Количество первых строк, которые будут пропущены в содержании файла. По умолчанию skip=0
eol=;
eol (End of Line): Определяет особый символ, который поставлен в начале строки, чтобы отметить эту строку как примечание. Строка примечания будет пропущена программой. По умолчанию это знак точки с запятой ( ; )
tokens=n1,n2,n3
Определить нужные позиции (n1, n2, n3, ..), По умолчанию tokens=1
usebackq
(Смотреть объяснение в примерах)
Чтобы легче понять, проанализируем следующие файлы:
eol (End of Line)
eol: Использовать для определения особого символа. По умолчанию является символ точки с запятой ( ; ). Поставлено в начале строки для отметки этой строки как примечания (comment), программа пропустит данную строку.
skip=n
skip: Объявить, что количество первых строк будет пропущено, программа не проанализирует данные строки. по умолчанию skip=0
delims (Delimiter character(s))
delims: Определияет символы разделителя (delimiter characters), помогая программе разделить каждую строку текста на мелкие параграфы, каждый параграф называется Token. Token индексированы 1, 2, 3, ...
tokens=n1,n2,n3
tokens: Объявляет список заинтересованных индексов, индексы разделены запятой. Например tokens=1,2,4. По умолчанию: tokens=1
Tokens
Описание
tokens=1,2,4
Индексы 1, 2, 4 заинтересованы.
tokens=2-8
Индексы от 2 до 8 заинтересованы
tokens=3,*
Индексы 3, 4,5, ... заинтересованы
tokens=*
Все индексы заинтересованы
Например "tokens=1,2,4", значит только Token в позиции 1, 2, 4 заинтересованы, другие Token будут пропущены (Ignore).
Пример анализа файла:
Пример использования цикла FOR /F для чтения файла persons.txt:
persons.txt
List of celebrities
Creation date: 2017/09/11

; (Comment) Male List
Bill,Gates,1955/10/28,Male
Steve,Jobs,1955/02/24,Male
Mark,Zuckerberg,1984/05/16,Male
Sundar,Pichai,1972/07/12,Male
; (Comment) Female List
Hillary,Clinton,1947/10/26,Female
forF_example1.bat
@echo off 
FOR /F "delims=, skip=3 eol=; tokens=1,2,4" %%i IN ( persons.txt ) DO  (
   echo Full Name: %%i %%j   Gender: %%k
)
pause
Примечание: Названия переменных в цикле имеют только 1 символ.
Переменная %%i объявлено явным способом на цикле. Переменные %%j, %%k являются переменными, объявленные неявным способом (Названия неявных переменных являются следующие символы явных переменных).
Пример анализа строки:
  • TODO