С Новым годом! Форум программистов, компьютерный форум, киберфорум
Batch (CMD/BAT)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.81/21: Рейтинг темы: голосов - 21, средняя оценка - 4.81
948 / 403 / 323
Регистрация: 12.07.2018
Сообщений: 534

Циклы и разные if-else в одном цикле

14.02.2021, 22:35. Показов 4030. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
::Определение конечной папки
for /d %%D in (Process\*) do (
::Обрабатываемые файлы. Ранее указывал тут *.m* вместо mkv/mp4, но в исходных именах точки вместо пробелов, что может привести к неверному определению расширения, потому задал типы явно.
    for /f "delims=" %%X in ('dir /s/b "%%D\*.mkv" "%%D\*.mp4" "%%D\*.srt"') do for /f "delims=" %%M in ('"MediaInfo --Inform=Video;%%FrameRate_Mode%% "%%D\*.m*""') do for /f "delims=" %%R in ('"MediaInfo --Inform=Video;%%FrameRate%% "%%D\*.m*""') do (
::Выделение имени конечной папки до знака ) для переименования файлов
        for /f "delims=) tokens=1" %%T in ("%%D") do (
::Схема условий: if Condition (if Sub-condition1a (Command1a) else Sub-condition1b (Command2b)) else (if Sub-condition2a (Command2a) else Sub-condition2b (Command2b))
            if '%%M'=='CFR' (if '%%R'=='23.976' (move "%%X" "%%~nT)%%~xX") ^
else if not exist "%%R" (md "%%R"&move "%%X" "%%R\%%~nT)%%~xX")) ^
else (if '%%R'=='23.976' (mkvmerge -o "%%~nT).mkv" --default-duration 0:%%Rfps "%%D\*.m*") else if not exist "%%R" (md "%%R"&mkvmerge -o "%%R\%%~nT).mkv" --default-duration 0:%%Rfps "%%D\*.m*"))
)))
%%~nT может не раскрыться для *.srt.
He уверен в правильности условий, скобок. B выдаче может быть верно, но не применяться.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
14.02.2021, 22:35
Ответы с готовыми решениями:

Создать программный код, использую разные циклы (Циклы: for, While (Do-While)
Напечатать "столбиком" третьи степени всех целых чисел от a до 50 (значение a присваивается через переменную)

Циклы в цикле
Доброго времени суток, появился вопрос, как сделать так чтобы все циклы которые находятся в данном коде просто увеличивались на 1 ? я хочу...

Циклы в цикле, задача
Помогите решить задачу, не получается. Даша любит путешествовать и хочет посетить несколько разных интересных мест в этом году. Выбор...

10
6968 / 2862 / 1100
Регистрация: 06.06.2017
Сообщений: 9,711
15.02.2021, 00:11
Masutin, что-то я не понял, что *.srt делает в одном цикле с видео? И какой смысл в *.m* во 2 и 3 циклах, если в родительском идёт пофайловый перебор?
А со скобками явно беда, ибо форматирование приводить в божеский вид надобно.
1
948 / 403 / 323
Регистрация: 12.07.2018
Сообщений: 534
16.02.2021, 15:40  [ТС]
1) *.srt ввёл в %%X для использования в move, но не работает. Если добавить &if exist "%%D\*.srt" (move "%%D\*.srt" "%%~nT).srt"), работает, но если выполнено условие для else и if exist "%%D\*.srt", не работает и для %%X (mp4/mkv).
2) Если верно понял, добавил две пары скобок в if-else.
3) Получение имени через %%~nT несовершенно, если содержит точку.
Windows Batch file
1
2
3
4
    for /f "delims=" %%X in ('dir /s/b "%%D\*.mkv" "%%D\*.mp4"') do for /f "delims=" %%M in ('"MediaInfo --Inform=Video;%%FrameRate_Mode%% "%%X"') do for /f "delims=" %%R in ('"MediaInfo --Inform=Video;%%FrameRate%% "%%X"') do (
        for /f "delims=) tokens=1" %%T in ("%%D") do (
            if '%%M'=='CFR' (if '%%R'=='23.976' (move "%%X" "%%~nT)%%~xX"&if exist "%%D\*.srt" (move "%%D\*.srt" "%%~nT).srt")) else (if not exist "%%R" (md "%%R"&move "%%X" "%%R\%%~nT)%%~xX"))) ^
else (if '%%R'=='23.976' (mkvmerge -o "%%~nT).mkv" --default-duration 0:%%Rfps "%%X") else (if not exist "%%R" (md "%%R"&mkvmerge -o "%%R\%%~nT).mkv" --default-duration 0:%%Rfps "%%X")))
0
4340 / 2130 / 661
Регистрация: 26.04.2015
Сообщений: 6,823
17.02.2021, 04:14
Цитата Сообщение от FlasherX Посмотреть сообщение
форматирование приводить в божеский вид надобно
это точно, причесал на скорую руку, но лучше бы и все if перевести на call - для каждого свое условие, пусть строк будет и больше, но хоть меньше шансов запутаться, иначе даже так в кашу превращается
Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
@echo off
for /d %%D in (Process\*) do (
  for /f "delims=" %%X in ('where /r "%%D" *.mkv *.mp4 *.srt') do (
    for /f "delims=" %%M in ('"MediaInfo --Inform=Video;%%FrameRate_Mode%% "%%D\*.m*""') do (
      for /f "delims=" %%R in ('"MediaInfo --Inform=Video;%%FrameRate%% "%%D\*.m*""') do (
        for /f "delims=) tokens=1" %%T in ("%%D") do call :# "%%M" "%%R" "%%X" "%%~nT" "%%~xX"
      )
    )
  )
)
pause& exit
 
:# [M] [R] [X] [nT] [xX]
if "%~1"=="CFR" if "%~2"=="23.976" (
  move ...
) else if not exist "%~2" (
  md ...
) else if "%~2"=="23.976" (
  mkvmerge ...
) else if not exist "%~2" (
  md ...
)
exit /b
1
6968 / 2862 / 1100
Регистрация: 06.06.2017
Сообщений: 9,711
17.02.2021, 09:43
Masutin, при пофайловом переборе логика дальнешего зацикливания по маске совершенно неясна. Составьте полноценное ТЗ, тогда можно будет говорить о конкретике.
1
948 / 403 / 323
Регистрация: 12.07.2018
Сообщений: 534
18.02.2021, 23:42  [ТС]
Работает не co всеми условиями. Попытаюсь кратко сначала:
Путь Process\'Title (1999)*'\*.*

Файлы
Na.me.mp4 или Na.me.mkv [точки вместо пробелов]
if exist Na.me.srt или if exist [пример] Subs\2_Eng.srt

Новое имя файлов
'Title (1999)' [Удалить текст после ), если есть. Или нужен иной способ получения имени, если в нём точка.]

Условия (без else лучше?)
:# [M] [R] [X] [nT] [xX]
if "%~1"=="CFR" if "%~2"=="23.976" (move "%~3" "%~4)%~5")
if "%~1"=="CFR" if "%~2"=="%~2" (md %~2&move "%~3" "%~2\%~4)%~5")
if "%~1"=="VFR" if "%~2"=="23.976" или
if not "%~1"=="CFR" if "%~2"=="23.976" (mkvmerge 1)
if "%~1"=="VFR" if "%~2"=="%~2" или
if not "%~1"=="CFR" if not "%~2"=="23.976" (mkvmerge 2)

Почему-то XP не признаёт where. Заменил на dir.
0
6968 / 2862 / 1100
Регистрация: 06.06.2017
Сообщений: 9,711
19.02.2021, 12:23
Masutin, очередная попытка поковыряться в частностях никак на полноценное ТЗ не тянет.
Даже в проблеме с точками трудно уловить замысел. Целое имя каталога получаем с прописью расширения: %%~nxT, если речь об этом.
То бишь, если не брать во внимание исходные цели, код из 3 поста в нормальном виде выглядел бы так:
Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
@echo off
for /d %%D in (Process\*) do (
   for /f "delims=" %%X in ('dir /s/b "%%D\*.mkv" "%%D\*.mp4"') do (
      for /f "delims=" %%M in ('"MediaInfo --Inform=Video;%%FrameRate_Mode%% "%%X"') do (
         for /f "delims=" %%R in ('"MediaInfo --Inform=Video;%%FrameRate%% "%%X"') do (
            for /f "delims=) tokens=1" %%T in ("%%D") do (
               if '%%M'=='CFR' (
                  if '%%R'=='23.976' move "%%X" "%%~nxT)%%~xX"
                  if exist "%%D\*.srt" (
                     move "%%D\*.srt" "%%~nxT).srt"
                  ) else (
                     if not exist "%%R" (
                        md "%%R"&move "%%X" "%%R\%%~nxT)%%~xX"
                     ) else (
                        if '%%R'=='23.976' (
                           mkvmerge -o "%%~nxT).mkv" --default-duration 0:%%Rfps "%%X"
                        ) else (
                           if not exist "%%R" md "%%R"&mkvmerge -o "%%R\%%~nxT).mkv" --default-duration 0:%%Rfps "%%X"
                        )
                     )
                  )
               )
            )
         )
      )
   )
)
Но я бы в контексте bat матрёшке из циклов предпочёл бы for-ы с сохранением в переменные среды.
1
948 / 403 / 323
Регистрация: 12.07.2018
Сообщений: 534
23.02.2021, 16:57  [ТС]
He догадался об nx! Вопрос c точкой в названии решён.
Выполняется только условие 1 (CFR/23.976).

He уверен в полноценном TЗ в этом случае. Скрипт для файлов *.mkv и *.mp4 c возможностями:
1) Переименования по названию папки, содержащей обрабатываемый файл. B имени папки использовать знаки до ) включительно.
2) Перемещения согласно значению FPS c учётом постоянного (CFR) или переменного (VFR) значения FPS для преобразования VFR в CFR. При наличии файла *.srt в папке, содержащей обрабатываемый файл, перемещать его в то же место.

Медиафайлы можно обозначить как *.m*, но при этом, вероятно, если в исходном названии есть текст .m, могут быть обработаны ненужные файлы. Пофайловый перебор *.mkv и *.mp4 был вместе c маской *.m* из-за несовершенства моего кода.
0
6968 / 2862 / 1100
Регистрация: 06.06.2017
Сообщений: 9,711
23.02.2021, 19:46
Цитата Сообщение от Masutin Посмотреть сообщение
B имени папки использовать знаки до ) включительно.
А скобки там всегда есть?
Цитата Сообщение от Masutin Посмотреть сообщение
Перемещения согласно значению FPS c учётом постоянного (CFR) или переменного (VFR) значения FPS для преобразования VFR в CFR
Вот тут не вижу подробностей. "согласно значению" — это 23.976. FrameRate_Mode выдаёт CFR или VFR. Как и в каких условиях их комбинировать для перемещения?
1
948 / 403 / 323
Регистрация: 12.07.2018
Сообщений: 534
25.02.2021, 13:48  [ТС]
1) Переименование по названию папки, содержащей обрабатываемый файл (далее - Папка). B имени Папки использовать знаки до ) включительно. Скобка есть в имени всех Папок.
2) Обработка согласно числу FPS и постоянному (CFR) или переменному (VFR) числу FPS.
a) Файлы c CFR перемещать, a
b) файлы c VFR преобразовывать в CFR и конечные файлы помещать:
c 23.976 - на уровень выше;
c FPS, отличным от 23.976, - на уровень выше в папку c именем, задаваемым числом FPS.
3) При наличии файла *.srt в Папке (в редком случае во вложенной папке) перемещать его в конечное место медиафайла. B редком случае *.srt может быть более одного; для простоты этим можно пренебречь.
0
948 / 403 / 323
Регистрация: 12.07.2018
Сообщений: 534
19.03.2021, 10:36  [ТС]
Лучший ответ Сообщение было отмечено FlasherX как решение

Решение

Решение на основе кода alpap.
Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
set "dI=Process"
set "dO=.."
for /f "delims=" %%X in ('dir /a-d/b/s "%dI%\*.mkv" "%dI%\*.mp4"') do (
    for /f "delims=" %%M in ('"%MediaInfo% --Inform=Video;%%FrameRate_Mode%% "%%X""') do (
        for /f "delims=" %%R in ('"%MediaInfo% --Inform=Video;%%FrameRate%% "%%X""') do (
            if "%%M"=="VFR" if "%%R"=="23.976" if "%%R"=="29.970" (
                call :1 "%%X" "%dI%" "%dO%"
            )
            if "%%M"=="CFR" if "%%R"=="23.976" if "%%R"=="29.970" (
                call :2 "%%X" "%dI%" "%dO%"
            )
            if "%%M"=="VFR" if not "%%R"=="23.976" if not "%%R"=="29.970" (
                call :3 "%%X" "%dI%" "%dO%" "%%R"
            )
            if "%%M"=="CFR" if not "%%R"=="23.976" if not "%%R"=="29.970" (
                call :4 "%%X" "%dI%" "%dO%" "%%R"
            )
        )
    )
)
:1 [*.m*] [Process] [..]
    for /f "tokens=1,2 delims=()" %%a in ("%~1") do (
        %mkvmerge% -o "%~3\%%~na (%%b).mkv" --default-duration 0:23.976fps "%~1"
        for /f "delims=" %%S in ('dir /a-d/b/s "%~2\*.srt"') do if exist "%%S" (
        if %%~zS GTR 999 move "%%S" "%~3\%%~na (%%b).srt")
    )
exit /b
:2 
    for /f "tokens=1,2 delims=()" %%a in ("%~1") do (
        move "%~1" "%~3\%%~na (%%b)%%~xX"
    )
exit /b
:3 [*.m*] [Process] [..] [not 23.976]
    for /f "tokens=1,2 delims=()" %%a in ("%~1") do (
        if not exist "%~3\%~4" md "%~3\%~4"
        %mkvmerge% -o "%~3\%~4\%%~na (%%b).mkv" --default-duration 0:%~4fps "%~1")
    )
exit /b
:4 
    for /f "tokens=1,2 delims=()" %%a in ("%~1") do (
        if not exist "%~3\%~4" md "%~3\%~4"
        move "%~1" "%~3\%~4\%%~na (%%b)%%~xX"
    )
exit /b
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
19.03.2021, 10:36
Помогаю со студенческими работами здесь

разные шрифты в одном текстбоксе
Помогите написать код который позволял бы в одном текстбоксе писать символы разными шрифтами

Разные скрипты на одном спрайте, 2D
Добрый день, форумчане! Есть 2D объект (в игре - карта). У неё есть три области, при клике на которые происходят различные по своей...

Разные языки в одном файле
В общем имею файл в котором записаны последовательно тексты на разных языках. язык1 язык2 язык3 .. языкN Имею N парсеров...

Разные FQDN в одном домене AD
Здравствуйте. Имеется домен company.local . Можно ли сделать так, что бы ряд компьютеров в домене могли иметь FQDN отличное от имени...

Можно ли в цикле использовать циклы
Нужно записать в файл базу номеров две цифры не известны, я создал цикл for, внутри этого цикла еще один цикл. Значение первого цикла это...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru