Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - пакетное конвертирование с регулярными выражениями

Ответить
Настройки темы
CMD/BAT - пакетное конвертирование с регулярными выражениями

Новый участник


Сообщения: 8
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

Отправлено: 10:45, 04-12-2010

 

Аватара для gora

Ушёл из жизни


Сообщения: 6021
Благодарности: 3491

Профиль | Отправить PM | Цитировать


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

Отправлено: 11:52, 04-12-2010 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Старожил


Сообщения: 175
Благодарности: 119

Профиль | Отправить PM | Цитировать


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

Отправлено: 12:06, 04-12-2010 | #3


Новый участник


Сообщения: 8
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

Отправлено: 12:17, 04-12-2010 | #4


Старожил


Сообщения: 175
Благодарности: 119

Профиль | Отправить PM | Цитировать


Код: Выделить весь код
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

Последний раз редактировалось SendMessage, 04-12-2010 в 13:03.

Это сообщение посчитали полезным следующие участники:

Отправлено: 12:48, 04-12-2010 | #5


Новый участник


Сообщения: 8
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

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

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

Отправлено: 13:46, 04-12-2010 | #6


Старожил


Сообщения: 175
Благодарности: 119

Профиль | Отправить PM | Цитировать


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

Отправлено: 13:54, 04-12-2010 | #7


Старожил


Сообщения: 352
Благодарности: 119

Профиль | Отправить PM | Цитировать


Цитата 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. ну вот опять в одну строку »
м.б. переносы строк у тебя неправильные?

Последний раз редактировалось kiripanda, 04-12-2010 в 14:41.

Это сообщение посчитали полезным следующие участники:

Отправлено: 14:07, 04-12-2010 | #8


Новый участник


Сообщения: 8
Благодарности: 0

Профиль | Отправить PM | Цитировать


способы 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!)"

Отправлено: 14:18, 04-12-2010 | #9


Старожил


Сообщения: 352
Благодарности: 119

Профиль | Отправить PM | Цитировать


Код: Выделить весь код
@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
)
* без ^
Это сообщение посчитали полезным следующие участники:

Отправлено: 14:32, 04-12-2010 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - пакетное конвертирование с регулярными выражениями

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - [решено] Пакетное переименование файлов ArsenBespalov Скриптовые языки администрирования Windows 9 11-08-2016 03:56
[решено] Пакетное переименование ярлыков SimSim Хочу все знать 9 24-10-2012 10:44
CMD/BAT - [решено] Пакетное преобразование данных с помощью cmd Tosyk Скриптовые языки администрирования Windows 22 26-11-2010 14:13
CMD/BAT - [решено] Пакетное переименование с использованием алфавитного счётчика kotik147 Скриптовые языки администрирования Windows 6 13-05-2010 00:03
Помогите разобраться с регулярными выражениями pingUIN Хочу все знать 2 31-01-2007 12:26




 
Переход