Как стать автором
Обновить

И старый BAT-ник душу греет

Время на прочтение4 мин
Количество просмотров1.5K
Иногда случаются ситуации, когда хочется малость автоматизировать какую-то мелкую задачу, а любимого инструмента под рукой нет. Или просто лень что-то кодить в любимой «суперсовременной» IDE ради мелочной задачи, хочется как-то сделать это проще, более системными и приземленными способами. По крайней мере у меня именно так :)

И вот тогда на ум мне почему-то сразу приходит старый добрый bat (пользователей Linux-a не считаем, у них там все намного проще).

Как же приятно порою бывает, когда то, что ты учил в школе (и институте) еще тогда, можно как-то использовать и сейчас!!!
Пусть даже и для такой тривиальной задачи, как формирование плейлиста нужной директории.

Хотя даже эта задача появилась неспроста. Когда-то в далеком 2004 году, листая помощь по модному тогда медиаплееру Light Alloy (а я как то на нем остался и до сих пор), я встретил элементарную схемку приемника для пульта ДУ. Даже мои скромные познания в электронике не смогли устоять перед любопытством и такой простой схемой. Задумано — сделано. И пусть и корявый, но все же рабочий приемник был спаян. Осталось дело за малым — научиться им пользоваться :) После некоторых поисков в интернете выбор остановился на Girder 3.10, после чего последний был успешно настроен на использование основных программ (winamp, la, far, explorer) и все стало совсем хорошо.
Но не даром говорят: лучшее — враг хорошего. И с появлением большего винта, локальной сетки и быстрого (относительно) интернета выбор новой музыки и фильмов стало все труднее делать лежа на диване — а ведь хочется.

Решение, с учетом возможности Girder-a создавать собственное OSD меню, было простым — не хватает только «команды» создания списка файлов директории, куда я бросал новые фильмы.
Вот тут и пришло время вспомнить про bat. Первый вариант был набросан за несколько минут, после подробного изучения команды dir. Но потом захотелось большего — выбор только видеофайлов, без описаний и незавершенных закачек, выбор не всей директории, а только части файлов и т.д.
Благо, открыв справку по пакетным файлам, увидел, что возможности их в ХР выросли по сравнению с 98-ой очень даже приятно.

Ну и вот результат:
_vnew.bat
(лежит в папке, прописанной в переменной PATH)
@ECHO OFF

REM используем режим отложенного раскрытия переменных
REM (для лучшей обработки имен файлов)
setlocal enabledelayedexpansion

REM устанавливаем типы файлов по умолчанию
set ftypes=*.AVI *.ASF *.DAT *.DIVX *.M*V *.MP4 *.MPE *.MP*G *.OGM *.VOB *.WM*

REM устанавливаем файл результатов
set TFILE=

REM устанавливаем директорию запроса по умолчанию
set TDIR=%cd%

set EXTLIST=0

REM проверяем указание директории запроса
if NOT ~%1~==~~ set TDIR=%1

REM проверяем указание пути файла результата
REM (если не указано - в текущей папке)
if /i ~%2~==~/file~ set TFILE=%3& shift 2& shift 2
if ~%TFILE%~==~~ set TFILE=%cd%\_vnew.lap

REM проверяем указание искомых списка файлов (масок файлов)
if '%2'=='' set FT=%ftypes%

echo будет сформирован список директории %TDIR% с маской %FT% и в файле %TFILE%. Прервать работу Ctrl+C
rem pause

REM удаляем старый плейлист
del %TFILE% >nul

REM переключаемся в стандартную кодировку Windows
chcp 1251

REM если список файлов не указан (типы по умолчанию),
REM то пропускаем разбор параметров
if ~%2~==~~ goto nexttype

REM указываем признак работы с параметрами, а не списка по умолчанию
set EXTLIST=1

REM разбор параметров (списка файлов) и переход на формирование списка,
REM если перебрали все - выход
:np
rem echo --%2-- & pause
if not ~%2~==~~ set FN=%2& shift 2& goto formlist
goto end

REM "отделение" очередной маски от списка типов
:nexttype
for /F "tokens=1*" %%F in ("%FT%") do set FN=%%F & set FT=%%G

REM формирование списка
:formlist

REM удаляем обрамляющие скобки в имени папки и файлов
for %%N in (!TDIR!) do set TDIR=%%~N
for %%N in (!FN!) do set FN=%%~N

REM выполняем команду "dir /a-d /s /b папка+файл" для
REM получения списка файлов и добавляем в плейлист
rem dir /a-d /s /b "!TDIR!\!FN!" >>%TFILE%

REM универсальнее, конечно, использовать другую конструкцию.
FOR /F "usebackq DELIMS=*" %%X IN (`dir /a-d /s /b "!TDIR!\!FN!"`) DO echo %%X >>%TFILE%
REM особенно, если нужно не просто список файлов, а и дополнительные "теги",
REM например, для GOM-а
REM FOR /F "usebackq DELIMS=*" %%X IN (`dir /a-d /s /b "!TDIR!\!FN!"`) DO echo ^<entry^>^<title^>%%X^</title^>^/^>^</entry^> >>%TFILE%

REM выбираем, что брать следующее
if %EXTLIST%==1 goto np
if not "%FT%"=="" goto nexttype

REM восстанавливаем кодировку (на всяк случай)
REM и запускаем плейлист
:end
rem sort %TFILE% /O %TFILE%
chcp 866
if exist %TFILE% start %TFILE%


Примеры вызова:
_vnew.bat M:\Media\Mult\New

_vnew.bat "E:\Video\Mult\Ussr\" /file=e:\video\rr.lap new1 zerkalce.avi "как старик корову продавал.avi"

_vnew.bat "E:\Video\Mult\Ussr\" /file=e:\video\rr.lap *.avi


Сейчас этот скрипт (с разными параметрами) — самый вызываемый и с пульта и с рабочего стола (мелочь выбирает, что с пары тысяч мультиков посмотреть), и голова не болит, что в какой-то папке что-то добавилось, удалилось или переместилось.
И его всегда можно без проблем поменять.

Вообщем, кому пригодится — я буду только очень рад :)

P.S. Отдельное спасибо viperet за приглашение :)
P.P.S. кроме того, само «ковыряние» технологий юности доставляет кучу удовольствия, если это актуально — так что, если у вас есть подходящая задача, не упустите шанс ;)

UPD: немножко исправил скрипт (правил 1 раз сразу в браузере — опечатался :()
Теги:
Хабы:
+15
Комментарии4

Публикации

Истории

Ближайшие события

Weekend Offer в AliExpress
Дата20 – 21 апреля
Время10:00 – 20:00
Место
Онлайн
Конференция «Я.Железо»
Дата18 мая
Время14:00 – 23:59
Место
МоскваОнлайн