|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - пакетное конвертирование с регулярными выражениями |
|
|
CMD/BAT - пакетное конвертирование с регулярными выражениями
|
Новый участник Сообщения: 8 |
Доброго времени суток.
Помогите дописать скрипт ![]() Задача: Имеется папка с 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 |
Ушёл из жизни Сообщения: 6021
|
Профиль | Отправить PM | Цитировать Fannylife1989
1 Оформляйте текст батника в тегах CODE, символ # (решетки) на панели "Быстрого ответа" 2 Полагаю, что причина в наличии круглых скобок ( ) в именах файлов. Скобки - служебные символы в батниках. Попробуйте сначала их переименовать. |
Отправлено: 11:52, 04-12-2010 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Старожил Сообщения: 175
|
Профиль | Отправить PM | Цитировать Fannylife1989
Не касаясь самого кода: IrfanView совершенно параллельно - есть такой файл для слияния или нет - он работает с существующими. Поэтому можно в /multitif=(...) перечислить все возможные файлы, например: И не париться с проверкой. |
Отправлено: 12:06, 04-12-2010 | #3 |
Новый участник Сообщения: 8
|
Профиль | Отправить 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 ![]() 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
|
Профиль | Отправить 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
|
Профиль | Отправить 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
|
Профиль | Отправить PM | Цитировать Fannylife1989, я тебе готовое решение предложил. Не устраивает?
|
Отправлено: 13:54, 04-12-2010 | #7 |
Старожил Сообщения: 352
|
Профиль | Отправить PM | Цитировать Цитата SendMessage:
Ещё решение. + Запакует 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:
|
||
Последний раз редактировалось kiripanda, 04-12-2010 в 14:41. Отправлено: 14:07, 04-12-2010 | #8 |
Новый участник Сообщения: 8
|
Профиль | Отправить PM | Цитировать способы sendmessage и kiripanda помогли, спасбио большое
![]() Ещё вопрос, как потом удалить файлы 1(1).jpg, 1(2).jpg и т.д. Желательно на основе скрипта kiripanda И ещё, просто самому интересно, почему не работал кусок |
Отправлено: 14:18, 04-12-2010 | #9 |
Старожил Сообщения: 352
|
Профиль | Отправить PM | Цитировать |
Отправлено: 14:32, 04-12-2010 | #10 |
|
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
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 |
|