Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   пакетное конвертирование с регулярными выражениями (http://forum.oszone.net/showthread.php?t=192996)

Fannylife1989 04-12-2010 10:45 1557996

пакетное конвертирование с регулярными выражениями
 
Доброго времени суток.
Помогите дописать скрипт :)
Задача:
Имеется папка с 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 1558028

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

SendMessage 04-12-2010 12:06 1558041

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 1558050

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

Код:

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 1558116

"if exist !j2!" && "if exist !j3!" && "if exist !j4!" && "i_view32.exe /killmesoftly /multitif=(!j0!,!j2!,!j3!,!j4!)"

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

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

SendMessage 04-12-2010 13:54 1558121

Fannylife1989, я тебе готовое решение предложил. Не устраивает?

kiripanda 04-12-2010 14:07 1558133

Цитата:

Цитата SendMessage
я тебе готовое решение предложил. Не устраивает? »

На каждый несуществующий файл выскакивает "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
)

Цитата:

Цитата Fannylife1989
p.s. ну вот опять в одну строку »

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

Fannylife1989 04-12-2010 14:18 1558141

способы 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 1558150

Код:

@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 1558260

Спасибо большое за помощь :)

Fannylife1989 05-12-2010 16:07 1558831

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

kiripanda 05-12-2010 16:40 1558849

5[пробел]00x.jpg ? Другие пробелы в имени могут быть? Цифр 00x вегда 3?

Fannylife1989 05-12-2010 16:42 1558852

не могут быть.
да всегда три, но в каждой группе есть файл и без цифр, то есть 5.jpg, 6.jpg а к ним уже 5 001.jpg, 5 002.jpg и т.п.

kiripanda 05-12-2010 17:02 1558865

Код:

@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 1558871

просто красавчик ))
спасбио большое :)


Время: 17:58.

Время: 17:58.
© OSzone.net 2001-