Batch, Вопросы по .bat скриптам |
Здравствуйте, гость ( Вход | Регистрация )
Batch, Вопросы по .bat скриптам |
28 Dec 2016, 11:46
Сообщение
#1
|
|
I must gather my party before venturing forth Сообщений: 5 071 Спасибо сказали: 17751 раз |
Не нашел готовой темы. Создал новую.
Такой вопрос. Когда мне нужно обработать все файлы в папке с какой-то командой, то я использую обычную конструкцию FOR - IN - DO А вот если мне нужно обработать две группы файлов так, что в итоговой команде нужно последовательно соединить файлы из обоих групп - первый с первым, второй со вторым и.т.д. Как-то это можно же сделать? Или придется уже писать какую-то конструкцию с подстановкой имен/номеров файлов? -------------------- |
|
|
28 Dec 2016, 14:05
Сообщение
#2
|
|
Immortal Сообщений: 6 260 Спасибо сказали: 12647 раз |
Так на пальцах непонятно, как именно комп должен понять, какой именно файл из второй группы относится к файлу первой группы. Просто номер в списке?
-------------------- |
|
|
28 Dec 2016, 14:51
Сообщение
#3
|
|
I must gather my party before venturing forth Сообщений: 5 071 Спасибо сказали: 17751 раз |
Так на пальцах непонятно, как именно комп должен понять, какой именно файл из второй группы относится к файлу первой группы. Просто номер в списке? Ну да. Также как и в обычном цикле с одной группой. Просто тут две группы файлов в разных папках. Т.е. вопрос, вероятно, о том, можно ли сделать двойной цикл с двумя for и in, но с одной командой. А если нет, то как данного результата можно как-то иначе добиться в батнике? -------------------- |
|
|
28 Dec 2016, 18:55
Сообщение
#4
|
|
😸🧡✊✌️ Сообщений: 16 023 Спасибо сказали: 2663 раза |
Думаю, этого можно достичь, воспользовавшись вспомогательным файлом и ключом /F.
test.cmd: Код @echo off test.txt:for /f "delims=| tokens=1,2" %%i in (test.txt) do ( echo %%i %%j ) Код file11|file12 Результат:file21|file22 file31|file32 Код $ test.cmd
file11 file12 file21 file22 file31 file32 -------------------- |
|
|
28 Dec 2016, 21:07
(Сообщение отредактировал Axolotl - 28 Dec 2016, 21:10)
Сообщение
#5
|
|
I must gather my party before venturing forth Сообщений: 5 071 Спасибо сказали: 17751 раз |
Если я правильно понял идею, то сперва, получается, нужно этот файл, опять же, сгенерить нужным образом, что возвращает к исходной задачи. Или нет? И, исходя из ответа, двойной цикл значит сделать нельзя?
Тогда, наверное, проще что-то придумать с просто подстановкой имен. Это, правда, уменьшит немного автоматизацию и создаст некоторые ограничения. Вообще, если подробнее, задача такая. И да, задача не разовая, а регулярная: Есть две папки с группами файлов. Скажем, покадровые анимации. Цели тут могут быть разные - это и соединить отрендеренную отдельно тень, и наложить также срендеренный отдельно слой ambient occlusion, или даже наложить анимрованный геройский флажок на анимированный двеллинг и.т.п И нужно их обработать каким-то образом, подставляя поочередно программе их имена парами. Причем, в виде отдельных переменных, т.к. синтаксис у итогового скрипта может быть самым разным. -------------------- |
|
|
29 Dec 2016, 06:31
Сообщение
#6
|
|
Etoprostostatus Сообщений: 8 527 Спасибо сказали: 15833 раза |
Папка 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'
|
|
|
29 Dec 2016, 09:02
(Сообщение отредактировал Axolotl - 29 Dec 2016, 09:24)
Сообщение
#7
|
|
I must gather my party before venturing forth Сообщений: 5 071 Спасибо сказали: 17751 раз |
Ну т.е. все-таки подстановкой имен. Это я вчера тоже уже сделал. Правда другим способом. И с лидирующими нулями (с которыми всегда Макс рендерит) разобрался иначе.
Делал через цикл "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. А, понял, так нельзя. Он будет не двойной цикл делать, а внутренние циклы, т.е. пытаться каждый с каждым по очереди. -------------------- |
|
|
29 Dec 2016, 11:44
(Сообщение отредактировал Axolotl - 29 Dec 2016, 11:48)
Сообщение
#8
|
|
I must gather my party before venturing forth Сообщений: 5 071 Спасибо сказали: 17751 раз |
P.S. Фак. Я совсем туплю. Вот что значит пытаться на больную голову делать. В случае если имена в обоих папках одинаковы, то вообще все тупо и не надо генерацией имен заниматься. Можно же просто одним циклом, а второму параметру просто путь подставить. Ну а если имена разные, то уже, видимо, нужно морочится вышеописанными способами. Но все равно удивительно почему нет двойного цикла.
-------------------- |
|
|
24 Jan 2017, 11:17
(Сообщение отредактировал feanor - 24 Jan 2017, 11:18)
Сообщение
#9
|
|
laughed as one fey Сообщений: 12 166 Спасибо сказали: 20585 раз |
Вечный вопрос про паузу для батника
теперь и не через пинг @choice /c:° /d ° /t:20 > nul в секундах |
|
|
24 Jan 2017, 11:58
Сообщение
#10
|
|
😸🧡✊✌️ Сообщений: 16 023 Спасибо сказали: 2663 раза |
А почему не
@choice /d y /t:20 >nul -------------------- |
|
|
24 Jan 2017, 12:07
(Сообщение отредактировал feanor - 24 Jan 2017, 12:13)
Сообщение
#11
|
|
laughed as one fey Сообщений: 12 166 Спасибо сказали: 20585 раз |
потому что y можно и случайно нажать, а знак градуса валиден для команды и в (большинстве) раскладок все-таки отсутствует (а если хочется хардкора, можно чего-нибудь типа старой псевдографики ░, те упыри, которые могут её случайно нажать, пусть получают все, что заслужили)
ну и для /d судя по документации /с таки необходим вот двоеточие необязательно, можно и просто @choice /c ° /d ° /t:20 > nul |
|
|
24 Jan 2017, 13:05
Сообщение
#12
|
|
😸🧡✊✌️ Сообщений: 16 023 Спасибо сказали: 2663 раза |
Не, это /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." -------------------- |
|
|
27 Jan 2017, 20:07
Сообщение
#13
|
|
Immortal Сообщений: 6 260 Спасибо сказали: 12647 раз |
Небольшое вступление:
В последнее время стал меньше читать, но стараюсь больше слушать какой-нибудь полезной информации. Хорошие и интересные подкасты - редкость, но на ютубе довольно много видеолекций, которые можно не смотреть, а в основном - слушать, благо, пока что хожу на работу пешком по довольно тихим местам. Цель: Слушать какие-нибудь лекции, презентации, рассказы или обсуждения с 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 - работает Как допилить батник, чтобы он понимал файлы с пробелами? Или есть прога под андроид, которая может качать аудио с ютупа? -------------------- |
|
|
27 Jan 2017, 22:04
(Сообщение отредактировал Axolotl - 27 Jan 2017, 22:10)
Сообщение
#14
|
|
I must gather my party before venturing forth Сообщений: 5 071 Спасибо сказали: 17751 раз |
Он пытается обработать только первую часть имени до пробела. Т.е. он воспринимает это как два/три и.т.д пришедших параметра, разделенных пробелами. %1 - подставляет первый параметр, %2 - второй и.т.д. %* - подставляет все пришедшие параметры разом.
Тебе нужно либо сразу подавать батнику имя файла в кавычках, но тогда, кажется, нужно убрать кавычки из батника, т.е. писать просто %1 (а иначе, скорее всего, будет две пары кавычек) Либо вместо "%1" использовать "%*" -------------------- |
|
|
28 Jan 2017, 12:09
Сообщение
#15
|
|
Immortal Сообщений: 6 260 Спасибо сказали: 12647 раз |
Тебе нужно либо сразу подавать батнику имя файла в кавычках, но тогда, кажется, нужно убрать кавычки из батника, т.е. писать просто %1 (а иначе, скорее всего, будет две пары кавычек) Нет. Если убрать кавычки, то батник берет только первое слово из имени файла Какие лекарства придут на смену антибиотикам.mp4 -> Какие Цитата Либо вместо "%1" использовать "%*" Не помогло. Попробовал использовать и вместо "%1" - "%1 %2 %3 %4 %5 %7", тоже не помогло А, проблема была с отсутствием кавычек на %~n1.mp3 -------------------- |
|
|
28 Jan 2017, 12:50
Сообщение
#16
|
|
I must gather my party before venturing forth Сообщений: 5 071 Спасибо сказали: 17751 раз |
Нет. Если убрать кавычки, то батник берет только первое слово из имени файла Какие лекарства придут на смену антибиотикам.mp4 -> Какие Ну да, как я и сказал. Убирать кавычки у %1 (кажется) надо только в том случае, если ты прямо на батник будешь уже подавать имя файла в кавычках: batnik.bat "Какие лекарства придут на смену антибиотикам.mp4" Т.к., по идее, он иначе возьмет слово в двойные кавычки. -------------------- |
|
|
16 Feb 2017, 16:41
Сообщение
#17
|
|
Immortal Сообщений: 6 260 Спасибо сказали: 12647 раз |
Озадачился ещё одним вопросом.
Есть картинка 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 почему-то работать не хочет
Прикрепленные файлы
-------------------- |
|
|
16 Feb 2017, 16:46
Сообщение
#18
|
|
laughed as one fey Сообщений: 12 166 Спасибо сказали: 20585 раз |
Но 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...
|
|
|
16 Feb 2017, 16:51
(Сообщение отредактировал Etoprostoya - 16 Feb 2017, 16:52)
Сообщение
#19
|
|
Etoprostostatus Сообщений: 8 527 Спасибо сказали: 15833 раза |
Iv
попробуй использовать проценты в crop https://www.imagemagick.org/Usage/crop/#crop_percent Или как феанор советует -------------------- Etoprostopodpis'
|
|
|
16 Feb 2017, 17:20
(Сообщение отредактировал Iv - 16 Feb 2017, 17:22)
Сообщение
#20
|
|
Immortal Сообщений: 6 260 Спасибо сказали: 12647 раз |
Ага, '@' flag сработал, лист распилился на кадры.
Осталось 1. заставить работать команду convert aniForge.png -crop 4x3@ +repage +adjoin out\%d.gif в батнике convert %1 -crop 4x3@ +repage +adjoin out\0%d.gif - не работает -------------------- |
|
|
Текстовая версия | Сейчас: 20 April 2024 - 06:12 |
Copyright by Алексей Крючков
Programming by Degtyarev Dmitry |