Войти

Показать полную графическую версию : пакетное конвертирование с регулярными выражениями


Fannylife1989
04-12-2010, 10:45
Доброго времени суток.
Помогите дописать скрипт :)
Задача:
Имеется папка с 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

gora
04-12-2010, 11:52
Fannylife1989
1 Оформляйте текст батника в тегах CODE, символ # (решетки) на панели "Быстрого ответа"
2 Полагаю, что причина в наличии круглых скобок ( ) в именах файлов. Скобки - служебные символы в батниках. Попробуйте сначала их переименовать.

SendMessage
04-12-2010, 12:06
Fannylife1989
Не касаясь самого кода: IrfanView совершенно параллельно - есть такой файл для слияния или нет - он работает с существующими. Поэтому можно в /multitif=(...) перечислить все возможные файлы, например:
i_view32.exe /multitif=(%var1%.tif,%var1%.jpg,%var1%(1).jpg,%var1%(2).jpg,%var1%(3).jpg,...,%var1%(9).jpg)
И не париться с проверкой.

Fannylife1989
04-12-2010, 12:17
Прошу прощения за такое оформление, в теге 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

p.s. ну вот опять в одну строку :(

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 с пустым названием, как от этого избафиться?

SendMessage
04-12-2010, 12:48
for %%a in (*) do call:tiff %%a
goto:eof
:tiff
set "n=%~n1"
if /i "%~x1" neq ".jpg" goto:end
if "%n:~-1%"==")" set "n=%n:~0,-3%"
if not exist %n%.tif i_view32.exe /multitif=(%n%.tif,%n%.jpg,%n%(1).jpg,%n%(2).jpg,%n%(3).jpg,,%n%(4).jpg,%n%(5).jpg,%n%(6).jpg,%n%(7). jpg,%n%(8).jpg,%n%(9).jpg) /killmesoftly
:end

Fannylife1989
04-12-2010, 13:46
"if exist !j2!" && "if exist !j3!" && "if exist !j4!" && "i_view32.exe /killmesoftly /multitif=(!j0!,!j2!,!j3!,!j4!)"

вот такая строка и ей подобные подлиннее у меня отказываются работать, в чём может быть проблема?

Когда убираю " кавычки то ругается на && говорит "непредвиденное появление &&"

SendMessage
04-12-2010, 13:54
Fannylife1989, я тебе готовое решение предложил. Не устраивает?

kiripanda
04-12-2010, 14:07
я тебе готовое решение предложил. Не устраивает? »На каждый несуществующий файл выскакивает "Error! Can't load: 'xxx.jpg'"


Ещё решение.
+ Запакует xxx(10).jpg и т.д.
@echo off
for /f "delims=(" %%f in ('dir /b "*(1).jpg"') do (

set "$num="
for /f "delims=" %%n in ('dir /b "%%f(*).jpg"') do (call set "$num=%%$num%%,%%n")
call I_view32.exe "/multitif=(%%f.tif%%$num%%)" /killmesoftly
)


p.s. ну вот опять в одну строку »м.б. переносы строк у тебя неправильные?

Fannylife1989
04-12-2010, 14:18
способы 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!)"

kiripanda
04-12-2010, 14:32
@echo off
for /f "delims=(" %%f in ('dir /b "*(1).jpg"') do (

set "$num="
for /f "delims=" %%n in ('dir /b "%%f(*).jpg"') do (call set "$num=%%$num%%,%%n")
call I_view32.exe "/multitif=(%%f.tif%%$num%%)" /killmesoftly
del "%%f(*).jpg" /q
)
* без ^

Fannylife1989
04-12-2010, 17:58
Спасибо большое за помощь :)

Fannylife1989
05-12-2010, 16:07
А подскажите, если файлы будут не 5(1).jpg, 5(2).jpg .... а 5.jpg, 5 001.jpg, 5 002.jpg.... как надо изменить последний скрипт чтобы всё так же работало? :)

kiripanda
05-12-2010, 16:40
5[пробел]00x.jpg ? Другие пробелы в имени могут быть? Цифр 00x вегда 3?

Fannylife1989
05-12-2010, 16:42
не могут быть.
да всегда три, но в каждой группе есть файл и без цифр, то есть 5.jpg, 6.jpg а к ним уже 5 001.jpg, 5 002.jpg и т.п.

kiripanda
05-12-2010, 17:02
@echo off
for /f "delims= " %%f in ('dir /b "* 001.jpg"') do (

set "$num="
for /f "delims=" %%n in ('dir /b "%%f.jpg" "%%f ???.jpg"') do (call set "$num=%%$num%%,%%n")
call I_view32.exe "/multitif=(%%f.tif%%$num%%)" /killmesoftly
del /q "%%f.jpg" "%%f ???.jpg"
)
Запакует файлы не только с цифрами, но с буквами 5 abc.jpg, 5 def.jpg ...

Fannylife1989
05-12-2010, 17:06
просто красавчик ))
спасбио большое :)




© OSzone.net 2001-2012