![]() |
пакетное конвертирование с регулярными выражениями
Доброго времени суток.
Помогите дописать скрипт :) Задача: Имеется папка с jpg файлами. Названия всех файлов являются либо числами, либо в формате 5(1).jpg, 5(2).jpg, 5(3).jpg, 12(1).jpg, 12(2).jpg, 12(3).jpg, 12(4).jpg и т.д. Максимальное значение числа в скобках 9. Есть программка IrfanView позволяющая из командной строки слить несколько файлов jpg в один tiff. Команда будет выглядеть так i_view32.exe /multitif=(Название_tiff_файла,первый_jpg_файл,второй_jpg_файл,третий_jpg_файл,...,N_jpg_файл) Необходимо сделать bat-ник который проходил бы по всем названиям файлов в папке и делал из файлов 5(1).jpg, 5(2).jpg, 5(3).jpg один файл 5.tiff и дальше по аналогии. Батник будет запускаться из папки с jpg-ами Я тут попробовал набросать скрипт, но он почему то не работает. Подозреваю что это из-за проблемы раннего связывания, но два дня чтения справочника по командной строке результатов не дали. Логика такова: в переменную var пишется название текущего файла из цикла, потом отбрасываются последние 4 символа (расширение), потом последние 3 символа сравниваются с (1), и если совпало - в переменную var1 пишется часть названия первого файла до скобок (то есть в случае если файл называется 5(1).jpg в переменную должно записаться 5). Если всё это произошло, вложенный цикл заново пробегает все файлы и ищет файл, у которого часть названия до скобок равна Var1. Если находит - записывает его название (вместе со скобками) в Var2 и идёт на следующий вложенный цикл искать. И так до (9). На оптимизацию скорости выполнения можно положить, главное чтобы работало. Вот мой скрипт. Поправьте его пожалуйста, сроки горят :( for %%a in (*) do ( set var=%%a set var=%var:~0,-4% if %var:~-3%==(1) do set var1=%var:~0,-3% ( for %%a in(*) do ( if %var:~0,-3%==var1 do ( set var2=var for %%a in(*) do ( if %var:~0,-3%==var1 do ( set var3=var for %%a in(*) do ( if %var:~0,-3%==var1 do ( set var4=var for %%a in(*) do ( if %var:~0,-3%==var1 do ( set var5=var for %%a in(*) do ( if %var:~0,-3%==var1 do ( set var6=var for %%a in(*) do ( if %var:~0,-3%==var1 do ( set var7=var for %%a in(*) do ( if %var:~0,-3%==var1 do ( set var8=var for %%a in(*) do ( if %var:~0,-3%==var1 do ( set var9=var for %%a in(*) do ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) i_view32.exe /multitif=(var1+".tif",var2+".jpg",var3+".jpg",var4+".jpg",var5+".jpg",var6+".jpg",var7+".jpg",var8+" .jpg",var9+".jpg") ) pause |
Fannylife1989
1 Оформляйте текст батника в тегах CODE, символ # (решетки) на панели "Быстрого ответа" 2 Полагаю, что причина в наличии круглых скобок ( ) в именах файлов. Скобки - служебные символы в батниках. Попробуйте сначала их переименовать. |
Fannylife1989
Не касаясь самого кода: IrfanView совершенно параллельно - есть такой файл для слияния или нет - он работает с существующими. Поэтому можно в /multitif=(...) перечислить все возможные файлы, например: Код:
i_view32.exe /multitif=(%var1%.tif,%var1%.jpg,%var1%(1).jpg,%var1%(2).jpg,%var1%(3).jpg,...,%var1%(9).jpg) |
Прошу прощения за такое оформление, в теге CODE почему-то весь мой код получился в одну строку - то есть неудобочитаем. Потому и выложил так.
Я переделал батник так: Код:
Setlocal EnableDelayedExpansion set j=0 FOR /F %%a in ('dir /b .\*.jpg') do ( set j=%%a set j=!j:~0,-4! if !j:~-3!=="(1)" do ( set j1=!j:~0,-3! set j0=!j1!.tif set j2=!j1!^(1^).jpg set j3=!j1!^(2^).jpg set j4=!j1!^(3^).jpg set j5=!j1!^(4^).jpg set j6=!j1!^(5^).jpg set j7=!j1!^(6^).jpg set j8=!j1!^(7^).jpg set j9=!j1!^(8^).jpg set j10=!j1!^(9^).jpg i_view32.exe /multitif=(!j0!,!j2!,!j3!,!j4!,!j5!,!j6!,!j7!,!j8!,!j9!,!j10!) i_view32.exe /killmesoftly ) pause Setlocal EnableDelayedExpansion set j=0 FOR /F %%a in ('dir /b .\*.jpg') do ( set j=%%a set j=!j:~0,-4! if !j:~-3!=="(1)" do ( set j1=!j:~0,-3! set j0=!j1!.tif set j2=!j1!^(1^).jpg set j3=!j1!^(2^).jpg set j4=!j1!^(3^).jpg set j5=!j1!^(4^).jpg set j6=!j1!^(5^).jpg set j7=!j1!^(6^).jpg set j8=!j1!^(7^).jpg set j9=!j1!^(8^).jpg set j10=!j1!^(9^).jpg i_view32.exe /multitif=(!j0!,!j2!,!j3!,!j4!,!j5!,!j6!,!j7!,!j8!,!j9!,!j10!) i_view32.exe /killmesoftly ) pause То есть он ищет все файлы с (1), и те, у которых находит, делает из файлов с тем же названием но суффиксами (2), (3) и т.д. до 9 один tiff. Но Дело в том, что т.к. не везде файлов по 9, чаще всего их меньше, то на каждый несуществующий файл он выдаёт окно с предупреждением, и пока я не нажму ОК выполнение батника не продолжается, хотелось бы избафиться от этого неприятного эффекта. А ещё в папке с файлами создаётся файл .tif с пустым названием, как от этого избафиться? |
Код:
for %%a in (*) do call:tiff %%a |
"if exist !j2!" && "if exist !j3!" && "if exist !j4!" && "i_view32.exe /killmesoftly /multitif=(!j0!,!j2!,!j3!,!j4!)"
вот такая строка и ей подобные подлиннее у меня отказываются работать, в чём может быть проблема? Когда убираю " кавычки то ругается на && говорит "непредвиденное появление &&" |
Fannylife1989, я тебе готовое решение предложил. Не устраивает?
|
Цитата:
Ещё решение. + Запакует xxx(10).jpg и т.д. Код:
@echo off Цитата:
|
способы sendmessage и kiripanda помогли, спасбио большое :)
Ещё вопрос, как потом удалить файлы 1(1).jpg, 1(2).jpg и т.д. Желательно на основе скрипта kiripanda И ещё, просто самому интересно, почему не работал кусок Код:
"if exist !j2!" && "if exist !j3!" && "if exist !j4!" && "i_view32.exe /killmesoftly /multitif=(!j0!,!j2!,!j3!,!j4!)" |
Код:
@echo off |
Спасибо большое за помощь :)
|
А подскажите, если файлы будут не 5(1).jpg, 5(2).jpg .... а 5.jpg, 5 001.jpg, 5 002.jpg.... как надо изменить последний скрипт чтобы всё так же работало? :)
|
5[пробел]00x.jpg ? Другие пробелы в имени могут быть? Цифр 00x вегда 3?
|
не могут быть.
да всегда три, но в каждой группе есть файл и без цифр, то есть 5.jpg, 6.jpg а к ним уже 5 001.jpg, 5 002.jpg и т.п. |
Код:
@echo off |
просто красавчик ))
спасбио большое :) |
Время: 17:58. |
Время: 17:58.
© OSzone.net 2001-