В этой статье мы рассмотрим как используется цикл for в командной строке (cmd) для групповой работы с каталогами. Как уже упоминалось, логику работы cmd цикла можно менять с помощью ключей, так, для обработки каталогов применяется ключ /D.
Стоит учитывать тот факт, что в данном случаем мы можем обработать все входящие на один уровень папки для заданного каталога, но не дальше, для обработки полный структуры, используется другой ключ — /R, примеры работы с которым мы рассмотрим по ходу статьи.
Фактически, с помощью цикла cmd for можно получить слепок всего дерева каталогов для заданного диска, и в групповом порядке их обработать.
Cmd цикл for – обработка корневых и вложенных папок
Для работы с каталогами цикл принимает следующий вид:
for /D %%переменная in (набор_каталогов) do (оператор)
Фактически, тут логика работы аналогична той, что используется при работе с файлами. Переменная набор_каталогов содержит путь к папке, содержимое которой нужно обработать. Только помните, что в данном случае мы получаем не список файлов, а каталогов. Мы также можем указать шаблон для поиска:
@echo off for /d %%B in (%SystemRoot%\*) do echo %%B |
В данном случае функция echo выведет список всех папок, которые есть в системном каталоге (путь к нему, хранится в переменной (%SystemRoot%). Или такой вариант:
@echo off for /d %%B in (%SystemRoot%S\*) do echo %%B |
Тут мы получим список лишь тех папок, имена которых начинаются на S.
Как и с файлами, можно указать список, используя в качестве разделителя пробел:
@echo off for /D %%B in (%SystemRoot%\* %TEMP%\*)do echo %%B |
Тут происходит вывод всех папок из системной и временной папки (переменная окружения %TEMP%).
А вот такая запись:
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= |
В данном примере вначале сценария создается переменная 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 |
В данном случае происходит поиск файлов с расширением .vbs и .js во всей структуре системного каталога, заданного переменной окружения SystemRoot.
Можно даже извлечь список всех вложенных каталогов для заданной структуры:
@echo off for /R %SystemRoot%/d %%B in (*) do echo %%B |
В данном случае, мы использовали оба ключа /R и /D, а символ звездочки указывает на то, что нужно извлечь список абсолютно всех вложенных папок.