Windows batch exercises

Уже долгое время у меня в планах висело создание автоматизированной системы для выкладывания фотографий в наш веб альбом, однако реально заняться этим получилось только сейчас (кстати, заняло создание этой системы всего пару часов). Сначала я хотел написать программу на Си, но после зрелого размышления понял, что все это можно реализовать средствами bat-файлов Windows. Конечно, для линуксоидов это все в порядке вещей, но для рядовых пользователей Windows может быть интересно, какие вещи можно реализовать с этой среде без знания программирования.

Итак, в чем наша задача? Есть кучка фотографий с произвольным именем, которые нужно переименовать в соответствии с шаблоном (например, iceland1.jpg, iceland2.jpg и т.д.), сделать thumbnail (миниатюру для превью, имя в нашем случае, традиционно для моих альбомов создается добавлением ‘s’ к имени файла, то есть в примере – iceland1s.jpg, iceland2s.jpg и т.д.), распаковать их по поддиректориям и, конечно же, создать саму страничку.

Начнем по порядку рассматривать результирующий скрипт:


@ECHO off

SET count=1
SET name=day6_
SET collection=iceland
SET title=Iceland, 26.07.2011 - 05.08.2011

Первая строчка – отключить вывод на экран команд по мере их выполнения (слишком забивает дисплей), далее устанавливаем переменные, которые нам понадобятся: счетчик, шаблон для картинок, название коллекции (коллекция может совмещать несколько типов картинок, например, из разных мест или объединенных какой-то общей тематикой) и, наконец, заголовок страницы.


call :head

FOR /F "tokens=*" %%G IN ('DIR /b *.JPG') DO (call :subroutine "%%G")

call :tail

mkdir small
move %name%*s.jpg small
mkdir %collection%
move %name%*.jpg %collection%

GOTO :eof

Подпрограммы head и tail создают соответственно шапку и низ HTML страницы с помощью команды ECHO (не забывайте, что служебные символы вроде скобок < > следует писать со значком ^: ^<, ^>, потому как они являются символами перенаправления (именно с помощью него и надо писать в файл следующим образом):


echo ^ > %collection%.htm

В этой строчке мы создаем файл (одиночная скобка >), для дозаписывания в него же нужно писать двойную скобку >>. Все как в линуксе!

Далее самое интересное – цикл! Разберем его подробнее:


FOR /F "tokens=*" %%G IN ('DIR /b *.JPG') DO (call :subroutine "%%G")

/F “tokens=*” говорит о том, что мы хотим работать с файлами, %%G – имя переменной цикла, далее в скобках команда, которая и будет поставлять нам список файлов – DIR /B – список файлов в короткой форме (только названия файлов, без размеров и прочего) *.JPG нужно, чтобы не обрабатывать сам файл скрипта и другие не относящиеся к делу файлы. Далее мы запускаем процедуру subroutine с параметром – имя файла с картинкой.

Последние строчки в приведенном выше отрывке не так важны – они просто переписывают полученные далее файлы с изображениями в отдельные директории – миниатюры в small, сами фотографии – в директорию с названием коллекции.


:subroutine
echo %name%%count%.jpg
i_view32 %1 /resize=(320) /aspectratio /convert=%name%%count%s.jpg
i_view32 %1 /resize=(1024) /aspectratio /convert=%name%%count%.jpg

set /a count2=count/3
set /a count2=count2*3

echo ^ >> %collection%.htm
echo ^^ >> %collection%.htm
echo ^<A HREF="%collection%/%name%%count%.jpg"^>^<IMG SRC="small/%name%%count%s.jpg" WIDTH="320" CLASS="index"^>^</A^> >> %collection%.htm

echo ^ >> %collection%.htm

if %count2%==%count% (
echo ^ >> %collection%.htm
echo ^ >> %collection%.htm
)

set /a count+=1
GOTO :eof

Разберем внимательно процедуру, которая работает с каждым файлом:
сначала она выводит на дисплей название файла, далее мы используем Irfanview для изменения размеров файлов – уменьшаем их по ширине до 320 для миниатюр и до 1024 для крупных изображений. Не забудьте про параметр aspectratio – без него он не будет менять высоту соответствующим образом! Параметр convert сохраняет полученный файл под новым именем (можно использовать и другой формат, например, png).

С помощью ряда команд ECHO мы записываем элемент HTML таблицы с данной картинкой в HTML файл (в данном случае используются таблицы, но я уверен, что легко можно изменить этот код для более современных методов отображения картинок в браузере).

Следующий элемент кода – немного изощренным способом проверяет, нужно ли закрыть тег TR (это делается для каждой третьей картинки). Для этого мы делим нацело текущий номер счетчика на 3, после чего умножаем его опять на 3 и сравниваем с номером до деления. Очевидно, что они будут совпадать только для номеров, делящихся на 3 нацело.

И, наконец, прибавляем счетчик.

Вот и всё! Сам макрос можно скачать здесь, а результат его применения можно посмотреть в нашем новом альбоме из Исландии.

This entry was posted in Интернет, Программирование, Фото. Bookmark the permalink.

Leave a Reply