batch-file
Для циклов в пакетных файлах
Поиск…
Синтаксис
- для / l %% p in (startNumber, increment, endNumber) do command
- for / f %% p in (filename) do command
- for / f %% p in ("textStrings") делает команду
- for / f %% p in ('command') do command
- for / r drive: \ path %% p in (set) do command
- for / d %% p in (directory) do command
замечания
Команда for
принимает опции при использовании флага /f
. Вот список вариантов, которые можно использовать:
delims=x
Делимитирующий символ (ы) для разделения токеновskip=n
Количество строк для прокрутки в начале файла и текстовых строкeol=;
Символ в начале каждой строки, чтобы указать комментарийtokens=n
Нумерованные позиции для чтения из каждой строки или строки для обработкиusebackq
Использовать другой стиль цитирования:Используйте двойные кавычки для длинных имен файлов в "файлах"
Используйте одиночные кавычки для 'textStrings'
Использовать обратные кавычки для `command`
Пересечение каждой строки в наборе файлов
Следующее будет отображать каждую строку в файле C:\scripts\testFile.txt
. Пустые строки не будут обрабатываться.
for /F "tokens=*" %%A in (C:\scripts\testFile.txt) do (
echo %%A
rem do other stuff here
)
Более подробный пример показывает, как производные в цикле FOR из данных с ограниченными файлами могут использоваться для перенаправления пакетного выполнения при сохранении искомого содержимого в файл:
@echo off
setlocal enabledelayedexpansion
for /f %%i in ('dir "%temp%\test*.log" /o:-d /t:w /b') do (
set "last=%temp%\%%i"
type !last! | find /n /i "Completed" >nul 2>&1 >> %temp%\Completed.log ^
&& (echo Found in log %%i & goto :end) || (echo Not found in log %%i & set "result=1"))
:: add user tasks code here
if defined result echo Performing user tasks...
:end
echo All tasks completed
exit /b
Обратите внимание, как долго командные строки разделяются на несколько строк кода, а группы команд разделяются скобками.
Рекурсивно посещать каталоги в дереве каталогов
команда for /r
может использоваться для рекурсивного посещения всех каталогов в дереве каталогов и выполнения команды.
@echo off
rem start at the top of the tree to visit and loop though each directory
for /r %%a in (.) do (
rem enter the directory
pushd %%a
echo In directory:
cd
rem leave the directory
popd
)
Заметки:
- for / r - Прокрутка файлов (вложенные папки Recurse).
- pushd - изменить текущий каталог / папку и сохранить предыдущую папку / путь для использования командой POPD.
- popd - сменить каталог обратно на путь / папку, которая была недавно сохранена командой PUSHD.
Переименование всех файлов в текущем каталоге
Следующая функция использует переменную с циклом for
для переименования группы файлов.
SetLocal EnableDelayedExpansion
for %%j in (*.*) do (
set filename=%%~nj
set filename=!filename:old=new!
set filename=Prefix !filename!
set filename=!filename! Suffix
ren "%%j" "!filename!%%~xj"
)
Определив имя переменной %%j
и связав ее со всеми текущими файлами (*.*)
, Мы можем использовать переменную в цикле for
для представления каждого файла в текущем каталоге.
Каждая итерация (или прохождение) через цикл обрабатывает другой файл из определенной группы (который может быть одинаково любой группой, например *.jpg
или *.txt
).
В первом примере мы подставляем текст: текстовая строка «old» заменяется текстовой строкой «new» (если, но только если в имени файла присутствует текст «old»).
Во втором примере мы добавляем текст: текст «Префикс» добавляется к началу имени файла. Это не замена. Это изменение будет применено ко всем файлам в группе.
В третьем примере снова мы добавляем текст: текст «Суффикс» добавляется в конец имени файла. Опять же, это не замена. Это изменение будет применено ко всем файлам в группе.
Последняя строка фактически обрабатывает переименование.
итерация
for /L %%A in (1,2,40) do echo %%A
Эта строка будет итерации от 1 до 39, увеличиваясь на 2 каждый раз.
Первый параметр, 1
, является стартовым номером.
Второй параметр, 2
, является приращением.
Третий параметр, 40
, является максимальным.