понедельник, 24 мая 2010 г.

batch: переименование файлов по маске.

Некоторые особенности программирования batch-файлов способны запутать даже мастеров скриптования.

Например. У нас есть директория с файлами вида a-001.zdt, a-002.zdt и т.д. Мы хотим их переименовать в a-wp001.zdt, a-wp002.zdt, ...

Это можно сделать следующим bat-ником:

for %%I in ("*.zdt") do (
for /f "delims=-. tokens=1,2,3" %%A in ('echo %%I') do (
ren %%I %%A-wp%%B.%%C )
)

Разберемся. Во внешнем цикле в переменную %%I по очереди помещаются имена файлов с расширением zdt. Внутренний цикл парсит имена - разбивает на куски. Ключ /f включает некоторые спецвозможности (см. help for). "delims=-." означает, что символы "-", "."мы считаем разделителями. "tokens=1,2,3" означает, что делим имя файла на 3 части по разделителям.

Переменная %%A - это итератор внутреннего цикла, как %%I - итератор внешнего. Но здесь %%A бежит не по списку файлов, а по строке, которую выводит команда echo %%I (которая выводит содержимое %%I, т.е. имя очередного файла). Одинарные кавычки и говорят циклу - итерируем по результату выполнения команды. Вообще, важно ставить нужные кавычки. Если поставить вокруг echo двойные кавычки - будет ошибка. В двойных надо писать списко файлов.

Теперь - внимание. Имя файла разбивается на три части. Первая помещается в итератор %%A. Вторая и третья - в ЛЮБЫЕ переменные, которые встрется внутри цикла. Здесь это %%B и %%С, но вовсе не обязательно брать подряд идущие буквы (A,B,С). Можно другие. Лихо, да? Batch, оказывается, хитроумнее Perl-a.

Да, вот еще. Переменные-итераторы могут иметь только однобуквенные названия.

Комментариев нет: