IPB

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V   1 2 >  
Reply to this topicStart new topic
> Batch, Вопросы по .bat скриптам
Axolotl
сообщение 28 Dec 2016, 11:46
Сообщение #1

I must gather my party before venturing forth
Сообщений: 4 437
Спасибо сказали: 16370 раз




Не нашел готовой темы. Создал новую.

Такой вопрос. Когда мне нужно обработать все файлы в папке с какой-то командой, то я использую обычную конструкцию FOR - IN - DO
А вот если мне нужно обработать две группы файлов так, что в итоговой команде нужно последовательно соединить файлы из обоих групп - первый с первым, второй со вторым и.т.д.
Как-то это можно же сделать? Или придется уже писать какую-то конструкцию с подстановкой имен/номеров файлов?


--------------------
Go to the top of the pageAdd Nick
 
+Quote Post
Iv
сообщение 28 Dec 2016, 14:05
Сообщение #2

Immortal
Сообщений: 6 158
Спасибо сказали: 12378 раз




Так на пальцах непонятно, как именно комп должен понять, какой именно файл из второй группы относится к файлу первой группы. Просто номер в списке?


--------------------
Go to the top of the pageAdd Nick
 
+Quote Post
Axolotl
сообщение 28 Dec 2016, 14:51
Сообщение #3

I must gather my party before venturing forth
Сообщений: 4 437
Спасибо сказали: 16370 раз




Цитата(Iv @ 28 Dec 2016, 18:05) *
Так на пальцах непонятно, как именно комп должен понять, какой именно файл из второй группы относится к файлу первой группы. Просто номер в списке?

Ну да. Также как и в обычном цикле с одной группой. Просто тут две группы файлов в разных папках. Т.е. вопрос, вероятно, о том, можно ли сделать двойной цикл с двумя for и in, но с одной командой. А если нет, то как данного результата можно как-то иначе добиться в батнике?


--------------------
Go to the top of the pageAdd Nick
 
+Quote Post
tolich
сообщение 28 Dec 2016, 18:55
Сообщение #4

Невыносимый
Сообщений: 13 893
Спасибо сказали: 26255 раз




Думаю, этого можно достичь, воспользовавшись вспомогательным файлом и ключом /F.
test.cmd:
Код
@echo off
for /f "delims=| tokens=1,2" %%i in (test.txt) do (
  echo %%i %%j
)
test.txt:
Код
file11|file12
file21|file22
file31|file32
Результат:
Код
$ test.cmd
file11 file12
file21 file22
file31 file32


--------------------


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
Axolotl
сообщение 28 Dec 2016, 21:07 (Сообщение отредактировал Axolotl - 28 Dec 2016, 21:10)
Сообщение #5

I must gather my party before venturing forth
Сообщений: 4 437
Спасибо сказали: 16370 раз




Если я правильно понял идею, то сперва, получается, нужно этот файл, опять же, сгенерить нужным образом, что возвращает к исходной задачи. Или нет? И, исходя из ответа, двойной цикл значит сделать нельзя?
Тогда, наверное, проще что-то придумать с просто подстановкой имен. Это, правда, уменьшит немного автоматизацию и создаст некоторые ограничения.

Вообще, если подробнее, задача такая. И да, задача не разовая, а регулярная: Есть две папки с группами файлов. Скажем, покадровые анимации. Цели тут могут быть разные - это и соединить отрендеренную отдельно тень, и наложить также срендеренный отдельно слой ambient occlusion, или даже наложить анимрованный геройский флажок на анимированный двеллинг и.т.п
И нужно их обработать каким-то образом, подставляя поочередно программе их имена парами. Причем, в виде отдельных переменных, т.к. синтаксис у итогового скрипта может быть самым разным.


--------------------
Go to the top of the pageAdd Nick
 
+Quote Post
Etoprostoya
сообщение 29 Dec 2016, 06:31
Сообщение #6

Etoprostostatus
Сообщений: 8 519
Спасибо сказали: 15775 раз




Папка cadre, файлы c_XXX.png
Папка shadow, файлы s_XXX.png
Папка out, файлы frame_XXX.png (результат работы)
XXX - трёхзначный номер: 000, 001, ..., 099, 100, ..., 999

//меньше 10 файлов для обработки
FOR /L %a IN (1,1,9) do convert cadre\c_00%a.png + shadow\s_00%a.png out\frame_00%a.png

//меньше 100 файлов для обработки
FOR /L %b IN (1,1,9) DO FOR /L %a IN (1,1,9) DO convert cadre\c_0%b%a.png + shadow\s_0%b%a.png out\frame_0%b%a.png

//меньше 1000 файлов для обработки
FOR /L %c IN (1,1,9) DO FOR /L %b IN (1,1,9) DO FOR /L %a IN (1,1,9) DO convert cadre\c_%c%b%a.png + shadow\s_%c%b%a.png out\frame_%c%b%a.png

Последний (условный) вариант как-то делал для себя. Рипал игру, а там кадры юнитов и кадры теней были в разных файлах.


--------------------
Etoprostopodpis'


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
Axolotl
сообщение 29 Dec 2016, 09:02 (Сообщение отредактировал Axolotl - 29 Dec 2016, 09:24)
Сообщение #7

I must gather my party before venturing forth
Сообщений: 4 437
Спасибо сказали: 16370 раз




Ну т.е. все-таки подстановкой имен. Это я вчера тоже уже сделал. Правда другим способом. И с лидирующими нулями (с которыми всегда Макс рендерит) разобрался иначе.
Делал через цикл "if - set - goto", а с нулями разобрался т.н. паддингом, т.е. отбрасыванием первого регистра путем %num:~-4%, а сам цикл шел начинаясь с 10000.


Но погоди. Ты таки используешь двойной и даже тройной цикл. "FOR /L %b IN (1,1,9) DO FOR /L %a IN (1,1,9) DO convert..."
В этом же и был мой вопрос. Я просто не знал как эта конструкция пишется. Нельзя ли в таком случае просто в первый IN вставить обычный (*.png), а во второй с путем ко второй папке (./path/*.png) ?
Или какая-то проблема возникнет? Сейчас попробую
....P.S. А, понял, так нельзя. Он будет не двойной цикл делать, а внутренние циклы, т.е. пытаться каждый с каждым по очереди.


--------------------
Go to the top of the pageAdd Nick
 
+Quote Post
Axolotl
сообщение 29 Dec 2016, 11:44 (Сообщение отредактировал Axolotl - 29 Dec 2016, 11:48)
Сообщение #8

I must gather my party before venturing forth
Сообщений: 4 437
Спасибо сказали: 16370 раз




P.S. Фак. Я совсем туплю. Вот что значит пытаться на больную голову делать. В случае если имена в обоих папках одинаковы, то вообще все тупо и не надо генерацией имен заниматься. Можно же просто одним циклом, а второму параметру просто путь подставить. Ну а если имена разные, то уже, видимо, нужно морочится вышеописанными способами. Но все равно удивительно почему нет двойного цикла.


--------------------


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
feanor
сообщение 24 Jan 2017, 11:17 (Сообщение отредактировал feanor - 24 Jan 2017, 11:18)
Сообщение #9

laughed as one fey
Сообщений: 11 812
Спасибо сказали: 19681 раз




Вечный вопрос про паузу для батника
теперь и не через пинг

@choice /c:° /d ° /t:20 > nul

в секундах


--------------------
Go to the top of the pageAdd Nick
 
+Quote Post
tolich
сообщение 24 Jan 2017, 11:58
Сообщение #10

Невыносимый
Сообщений: 13 893
Спасибо сказали: 26255 раз




А почему не
@choice /d y /t:20 >nul


--------------------
Go to the top of the pageAdd Nick
 
+Quote Post
feanor
сообщение 24 Jan 2017, 12:07 (Сообщение отредактировал feanor - 24 Jan 2017, 12:13)
Сообщение #11

laughed as one fey
Сообщений: 11 812
Спасибо сказали: 19681 раз




потому что y можно и случайно нажать, а знак градуса валиден для команды и в (большинстве) раскладок все-таки отсутствует (а если хочется хардкора, можно чего-нибудь типа старой псевдографики ░, те упыри, которые могут её случайно нажать, пусть получают все, что заслужили)
ну и для /d судя по документации /с таки необходим
вот двоеточие необязательно, можно и просто @choice /c ° /d ° /t:20 > nul


--------------------
Go to the top of the pageAdd Nick
 
+Quote Post
tolich
сообщение 24 Jan 2017, 13:05
Сообщение #12

Невыносимый
Сообщений: 13 893
Спасибо сказали: 26255 раз




Не, это /d необходим для /t, иначе непонятно, что делать по таймауту.

Edit: а, ясно, указанный в /d символ должен быть один из тех, что в /c. Но по умолчанию же /c yn, так что явный /c необязателен, если дефолт y или n.

Edit2: примеры в справке:
Код
   CHOICE /?
   CHOICE /C YNC /M "Y - Да, N - Нет, C - Отмена."
   CHOICE /T 10 /C ync /CS /D y
   CHOICE /C ab /M "a" для выбора параметра 1 и "b" для выбора параметра 2.
   CHOICE /C ab /N /M "a" для выбора параметра 1 и "b" для выбора параметра 2.
Третий и четвёртый пример синтаксически неверные, должно быть:
Код
   CHOICE /C ab /M "\"a\" для выбора параметра 1 и \"b\" для выбора параметра 2."
   CHOICE /C ab /N /M "\"a\" для выбора параметра 1 и \"b\" для выбора параметра 2."


--------------------
Go to the top of the pageAdd Nick
 
+Quote Post
Iv
сообщение 27 Jan 2017, 20:07
Сообщение #13

Immortal
Сообщений: 6 158
Спасибо сказали: 12378 раз




Небольшое вступление:
В последнее время стал меньше читать, но стараюсь больше слушать какой-нибудь полезной информации. Хорошие и интересные подкасты - редкость, но на ютубе довольно много видеолекций, которые можно не смотреть, а в основном - слушать, благо, пока что хожу на работу пешком по довольно тихим местам.

Цель:
Слушать какие-нибудь лекции, презентации, рассказы или обсуждения с Youtube на ходу с телефона. Не то, чтобы мне было жалко траффика, хотя и это тоже, но с аудио банально проще. Не надо опасаться, что вот экран включится или выключится и видео запустится заново, можно удобно проматывать вперед/назад, можно поставить закладку и потом вернуться к этому месту ещё раз и т.д. Правильный аудиоплеер рулит!

Вопрос удобного скачивания с ютуба и закачивания на телефон был решен, но в последнее время ютуб что-то докрутил и любимый FastestTube перестал нормально сохранять в m4a, но другое расширение позволяет удобно скачивать ролики в mp4.

Итого, есть задача:
Хочу сделать возможность извлечения аудиотрека из видеофайла, чаще всего mp4.

Накатал батничек
C:\Iv\Dropbox\Soft\Video\ffmpeg.exe -i "%1" -vn -ar 44100 -ac 2 -ab 192 -f mp3 %~n1.mp3

И прописал его вызов в контекстном меню файлов с расширением mp4, он работает, но получается извлекать музыку только из файлов без пробелов.
Биополимер вместо жгута.mp4 - не работает
БиополимерВместоЖгута.mp4 - работает

Как допилить батник, чтобы он понимал файлы с пробелами? Или есть прога под андроид, которая может качать аудио с ютупа?


--------------------
Go to the top of the pageAdd Nick
 
+Quote Post
Axolotl
сообщение 27 Jan 2017, 22:04 (Сообщение отредактировал Axolotl - 27 Jan 2017, 22:10)
Сообщение #14

I must gather my party before venturing forth
Сообщений: 4 437
Спасибо сказали: 16370 раз




Он пытается обработать только первую часть имени до пробела. Т.е. он воспринимает это как два/три и.т.д пришедших параметра, разделенных пробелами. %1 - подставляет первый параметр, %2 - второй и.т.д. %* - подставляет все пришедшие параметры разом.

Тебе нужно либо сразу подавать батнику имя файла в кавычках, но тогда, кажется, нужно убрать кавычки из батника, т.е. писать просто %1 (а иначе, скорее всего, будет две пары кавычек)

Либо вместо "%1" использовать "%*"


--------------------
Go to the top of the pageAdd Nick
 
+Quote Post
Iv
сообщение 28 Jan 2017, 12:09
Сообщение #15

Immortal
Сообщений: 6 158
Спасибо сказали: 12378 раз




Цитата(Axolotl @ 27 Jan 2017, 22:04) *
Тебе нужно либо сразу подавать батнику имя файла в кавычках, но тогда, кажется, нужно убрать кавычки из батника, т.е. писать просто %1 (а иначе, скорее всего, будет две пары кавычек)

Нет. Если убрать кавычки, то батник берет только первое слово из имени файла
Какие лекарства придут на смену антибиотикам.mp4 -> Какие

Цитата
Либо вместо "%1" использовать "%*"

Не помогло. Попробовал использовать и вместо "%1" - "%1 %2 %3 %4 %5 %7", тоже не помогло

А, проблема была с отсутствием кавычек на %~n1.mp3


--------------------
Go to the top of the pageAdd Nick
 
+Quote Post
Axolotl
сообщение 28 Jan 2017, 12:50
Сообщение #16

I must gather my party before venturing forth
Сообщений: 4 437
Спасибо сказали: 16370 раз




Цитата(Iv @ 28 Jan 2017, 16:09) *
Нет. Если убрать кавычки, то батник берет только первое слово из имени файла
Какие лекарства придут на смену антибиотикам.mp4 -> Какие

Ну да, как я и сказал. Убирать кавычки у %1 (кажется) надо только в том случае, если ты прямо на батник будешь уже подавать имя файла в кавычках: batnik.bat "Какие лекарства придут на смену антибиотикам.mp4" Т.к., по идее, он иначе возьмет слово в двойные кавычки.




--------------------
Go to the top of the pageAdd Nick
 
+Quote Post
Iv
сообщение 16 Feb 2017, 16:41
Сообщение #17

Immortal
Сообщений: 6 158
Спасибо сказали: 12378 раз




Озадачился ещё одним вопросом.

Есть картинка aniForge.png, где в лист собраны несколько (4*3) кадров анимации движения.
Есть батник
convert %1.png -crop 316x185 -transparent "rgb(0,255,0)" -dispose background out\%%02d.png
convert out\*.png -delay 6 +repage OUT.gif
, который умеет резать такие листы на набор кадров и потом собирать из них анимированную картинку, но ему надо в явном виде указывать размер кадра, это неудобно.

Хочу просто указывать батнику, сколько кадров по горизонтали (4) и по вертикали (3), чтобы он сам посчитал нужный размер кадра.

Есть команда для imagemagic, которая мне выводит размеры листа
identify -format "%wx%h" aniForge.png, где
%w - ширина, а %h - высота

Вот и пытаюсь передать в переменную параметр картинки, чтобы поделить его на кол-во кадров, которое буду передавать в параметре
Расчлененка+.bat aniForge.png 4 3

Как это сделать?
Банальное
SET W=identify -format "%w" aniForge.png
SET H=identify -format "%h" aniForge.png
почему-то работать не хочет
Прикрепленные файлы
Прикрепленный файл  aniForge.png ( 124.81 килобайт ) Кол-во скачиваний: 1
 


--------------------
Go to the top of the pageAdd Nick
 
+Quote Post
feanor
сообщение 16 Feb 2017, 16:46
Сообщение #18

laughed as one fey
Сообщений: 11 812
Спасибо сказали: 19681 раз




Но IM умеет резать на нужное число кусков искоропки!
http://www.imagemagick.org/Usage/crop/#crop_equal
Цитата
As of IM v6.5.8-9 you can now add the special '@' flag to the "-crop" argument. This flag tells the "-crop" operator to try its best to equally divide the image into the number of tiles given. For example...


--------------------


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
Etoprostoya
сообщение 16 Feb 2017, 16:51 (Сообщение отредактировал Etoprostoya - 16 Feb 2017, 16:52)
Сообщение #19

Etoprostostatus
Сообщений: 8 519
Спасибо сказали: 15775 раз




Iv
попробуй использовать проценты в crop
https://www.imagemagick.org/Usage/crop/#crop_percent

Или как феанор советует smile2.gif


--------------------
Etoprostopodpis'


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
Iv
сообщение 16 Feb 2017, 17:20 (Сообщение отредактировал Iv - 16 Feb 2017, 17:22)
Сообщение #20

Immortal
Сообщений: 6 158
Спасибо сказали: 12378 раз




Ага, '@' flag сработал, лист распилился на кадры.
Осталось
1. заставить работать команду convert aniForge.png -crop 4x3@ +repage +adjoin out\%d.gif в батнике
convert %1 -crop 4x3@ +repage +adjoin out\0%d.gif - не работает
2. заставить нумеровать получающиеся файлы с ведущим нулем,


--------------------
Go to the top of the pageAdd Nick
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



Текстовая версия Сейчас: 20 September 2019 - 02:02
Copyright by Алексей Крючков
Strategy Gamez by GrayMage
Programming by Degtyarev Dmitry
  Яндекс.Метрика