FOR /D %%f IN (C:\) DO ECHO %%f
2) FOR /R [[диск:]путь] %переменная IN (набор) DO команда [параметры]
Организует рекурсивное выполнение заданной команды для определенного каталога, а также всех его подкаталогов. Например, для распечатки всех файлов с расширением *.txt:
FOR /R %%f IN (*.txt) DO PRINT %%f
3) FOR /L %переменная IN (начало,шаг,конец) DO команда [параметры]
Класический цикл с параметром (заданными началом, концом и шагом приращения). Например:
FOR /L %%f IN (1,1,5) DO ECHO %%f
4) FOR /F [“ключи”] %переменная IN (набор) DO команда [параметры]
Чтение и обработка строк из набора текстовых файлов. Ключи позволяют выделять слова и подстроки (токены) по разделителям (DELIMS) или начальным символам.
5) FOR /F [“ключи”] %переменная IN (‘строка’) DO команда [параметры]
Позволяет обработать строку вывода определенной команды (вместо набора файлов в предыдущем варианте – строка вызоыв команды в апострофах). Например, для вывода имен всех переменных среды:
FOR /F “DELIMS==” %%i IN (‘SET’) DO ECHO %%i
Кроме того, для переменных команды FOR разрешены также синтаксические операции (выделение имени, пути, диска - аналогично рассм. выше переменным окружения).
Команда PUSHD сохраняет имя текущего каталога для команды POPD и осуществляет переход в другой каталог. Ее синтаксис имеет вид:
PUSHD [путь | ..]
Вновь сделать текущим каталог, сохраненный командой pushd, можно с помощью команды popd.
Упражнения
1. Пусть имеется текстовый файл protokol.txt, в котором хранится журнал обработанных файлов в следующем формате:
<имя файла> <дата> <время>
Слово дата здесь начинается в каждой строке с двадцатой позиции.
Необходимо написать командный файл, с помощью которого сделать выборку из этого файла (т. е. создать новый текстовый файл с нужной информацией) за заданный месяц (мм) и год (гггг) в файл ммгггг-.txt, сформированный файл упорядочить по дате обработки. Нужные месяц и год указать как параметры командной строки.
Решение:
Практически все нужные действия выполняются с помощью конвейеризации команд find и sort:
ЕСНО OFF RЕМ Проверка наличия параметров командной строки
IF -%1==- GOTO NoParam
IF -%2==- GOTO NoParam
REM Выделение нужных строк из файла protokol.txt
FIND "%1.%2" protokol.txt | SORT /+26 > %l%2.txt
GOTO End
NoParam
ECHO He заданы необходимые параметры командной строки!
PAUSE
End
2. Написать командный файл, который будет копировать из текущего каталога все файлы с расширением txt, кроме одного файла, указанного в качестве второго параметра командной строки, в каталог, указанный первым параметром. Если имя каталога, в который должно производиться копирование, не задано, то вывести сообщение об этом и прервать выполнение файла.
Решение:
Для выполнения поставленной задачи можно перебрать в цикле все файлы с расширением txt, проверяя перед копированием имя каждого из этих файлов:
ЕСНО OFF
REM Проверка наличия параметра командной строки
IF -%!==- GOTO NoDir
RЕМ Копирование нужных файлов
FOR %%f IN (*.txt) DO IF NOT -%%f==-%2 COPY %%f %1
GOTO End
NoDir
ECHO He указан каталог для копирования!
PAUSE
End
3. Задание аналогично второму упражнению. Дополнительные требования:
а) переписывать только те файлы, которые новее одноименных в каталоге - приемнике,
б) не прерывать копирование в случае возникновения ошибки,
в) записывать в файл logcopy.txt имя каждого копируемого файла и результат выполнения операции для него.
Другими словами, файл logcopy.txt должен быть примерно таким:
Успешно: а.txt
Ошибка : b.txt
Успешно: с.txt
Решение:
В этом упражнении нужно создать два пакетных файла. В основном файле работает такой же цикл for, как и в предыдущем упражнении, однако вместо непосредственного выполнения команды copy здесь вызывается
командный файл 3_1. bat:
ЕСНО OFF
REM Проверка наличия параметра командной строки
IF -%1==- GOTO NoDir
REM Вызов в цикле файла 3_l.bat для копирования нужного файла
FOR %%f IN (*.txt) DO IF NOT -%%f=-%2 CALL 3_l.bat %%f %1
GOTO End
NoDir