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

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

Ответить
Настройки темы
CMD/BAT - [решено] He все условия работают

Пользователь


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


Конфигурация

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


1) Переименование файлов *.mp4 *.mkv по названию папки, содержащей обрабатываемый файл (далее - Папка). 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 может быть более одного, чем можно пренебречь.
Код: Выделить весь код
@echo off
set MediaInfo=MediaInfo
set mkvmerge=mkvmerge
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"
                        if exist "%%D\*.srt" (move "%%D\*.srt" "%%R\%%~nxT).srt")
                     ) 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")))))))))

Отправлено: 19:06, 06-03-2021

 

Ветеран


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

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


вся загвоздка где-то тут:
Код: Выделить весь код
...            for /f "delims=) tokens=1" %%T in ("%%D") do (
покажите содержимое "D.txt" + возможные варианты
Код: Выделить весь код
for /d %%D in (Process\*) do echo "%%D">>D.txt
Это сообщение посчитали полезным следующие участники:

Отправлено: 20:24, 06-03-2021 | #2



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

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


Ветеран


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

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


Цитата Masutin:
Примеры (все такого вида):
"Process\1408 (2007)" »
...
тогда это:
Код: Выделить весь код
for /f "delims=) tokens=1" %%T in ("%%D") do
ни к чему
---
далее, если работа с несколькими файлами, а оно так и есть, то строки:
Код: Выделить весь код
          if "%%R"=="23.976" move "%%X" "%%~nxD%%~xX"
          if exist "%%D\*.srt" move "%%D\*.srt" "%%~nxD.srt"
(в реалии они так выглядят) будут давать ошибку типа: Перемещение нескольких файлов в один
ну и ниже все ломается по цепочке.
Короче надо сделать так. Пишите алгоритм с указанием желаемых имен, задачу с указанием существующих папок с файлами, для папки "Process" выполните:
Код: Выделить весь код
tree /f "Process">>file.txt
и выложите содержимое файла
после этого будем о чем-то говорить.
Это сообщение посчитали полезным следующие участники:

Отправлено: 04:52, 09-03-2021 | #3


Ветеран


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

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


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

Отправлено: 03:49, 11-03-2021 | #4


Пользователь


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

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


1 файл d:\Process\Mr. Nobody (2009) [YTS.AG]\*.mkv
1 файл d:\Process\Lebanon (2009)\*.mp4
1) Файл(ы) c CFR 23.976 переместить как
d:\Mr. Nobody (2009).mkv и
d:\Lebanon (2009).mp4.
2) Файл(ы) c CFR отличным от 23.976 (25.000/24.000/29.970) переместить как
d:\25.000\Mr. Nobody (2009).mkv и
d:\24.000\Lebanon (2009).mp4.
3) Файл(ы) c VFR 23.976 преобразовать в CFR через Remux (mkvmerge/FFmpeg) и сохранить как
d:\Mr. Nobody (2009).mkv и
d:\Lebanon (2009).mp4.
4) Файл(ы) c VFR отличным от 23.976 преобразовать, сохранив как
d:\25.000\Mr. Nobody (2009).mkv и
d:\24.000\Lebanon (2009).mp4.
При наличии файла
Process\Mr. Nobody (2009) [YTS.AG]\*.srt или
Process\Lebanon (2009)\*.srt
либо
Process\Mr. Nobody (2009) [YTS.AG]\Sub*\*.srt или
Process\Lebanon (2009)\Sub*\*.srt
переместить в место и c именем, как y *.mp4 или *.mkv.

Отправлено: 05:33, 12-03-2021 | #5


Ветеран


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

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


алгоритм конечно тот еще, бессвязный, неточный, имена все обобщены (ну сочту на то что составлялся пол пятого утра), например как может быть: d:\Mr. Nobody (2009).mkv, какое же следующее имя подобного файла?
я делал:
d:\Mr. Nobody (2009)_A.mkv
d:\Mr. Nobody (2009)_B.mkv
c srt не совсем понятно, я искал по всей глубине и сравнивал по имени из пути с одноименными искомыми, но есть вероятность совпадения имен, если по глубине есть несколько одинаковых по имени файлов, это уже не учитывал.
поставил пока copy вместо move
Код: Выделить весь код
@echo off
set "dI=D:\Process"
set "dO=D:"

for /f "delims=" %%F in ('dir /a-d/b/s "%dI%\*.mkv" "%dI%\*.mp4"') do (
  for /f "delims=" %%M in ('"%MediaInfo% --Inform=Video;%%FrameRate_Mode%% "%%F""') do (
    for /f "delims=" %%R in ('"%MediaInfo% --Inform=Video;%%FrameRate%% "%%F""') do (
      if "%%M"=="VFR" if "%%R"=="23.976" (
        for /f "delims=" %%f in ('"echo Команда на преобразование "%%F" из VFR в CFR"') do (
          call :#1 "%%f" "%dI%" "%dO%"
        )
      )
      if "%%M"=="CFR" if "%%R"=="23.976" (
        call :#1 "%%F" "%dI%" "%dO%"
      )
      if "%%M"=="VFR" if not "%%R"=="23.976" (
        for /f "delims=" %%f in ('"echo Команда на преобразование "%%F" не понял во что"') do (
          call :#2 "%%f" "%dI%" "%dO%" "%%R"
        )
      )
      if "%%M"=="CFR" if not "%%R"=="23.976" (
        call :#2 "%%F" "%dI%" "%dO%" "%%R"
      )
    )
  )
)
pause& exit

:#1 [full *.(mkv,mp4)] [D:\Process] [D:]
  for /f "tokens=1,2 delims=()" %%a in ("%~1") do (
    copy "%~1" "%~3\%%~na(%%b)_%~nx1"
    for /f "delims=" %%F in ('dir /a-d/b/s "%~2\*.srt"') do if exist "%%~dpF%~n1%%~xF" (copy "%%F" "%~3\%%~na(%%b)_%%~nxF")
  )
exit /b

:#2 [full *.(mkv,mp4)] [D:\Process] [D:] [no=23.976]
  for /f "tokens=1,2 delims=()" %%a in ("%~1") do (
    if not exist "%~3\%~4" md "%~3\%~4"
    copy "%~1" "%~3\%~4\%%~na(%%b)_%~nx1"
    for /f "delims=" %%F in ('dir /a-d/b/s "%~2\*.srt"') do if exist "%%~dpF%~n1%%~xF" (copy "%%F" "%~3\%~4\%%~na(%%b)_%%~nxF")
  )
exit /b

Последний раз редактировалось alpap, 13-03-2021 в 03:14.

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

Отправлено: 01:30, 13-03-2021 | #6


Пользователь


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

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


move работает. Нужна помощь c командой преобразования.
Из-за %%FrameRate %%X вместо %%F.
Код: Выделить весь код
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" (
				call :#1 "%%X" "%dI%" "%dO%"
			)
		)
	)
)
pause& exit

:#1 [full *.(mkv,mp4)] [D:\Process] [D:]
	for /f "tokens=1,2 delims=()" %%a in ("%~1") do (
		mkvmerge -o "%~3\%%~na (%%b).mkv" --default-duration 0:23.976fps "%~1"
	)
exit /b
call :#1 "%%f" "%dI%" "%dO%"
call :#1 "%%F" "%dI%" "%dO%"
Один call для разных аргументов и команд? Так можно и надо?

Отправлено: 02:28, 15-03-2021 | #7


Ветеран


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

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


Цитата Masutin:
Нужна помощь c командой преобразования »
я в этом не спец
Цитата Masutin:
%%X вместо %%F »
мне понравилось %%F, ставьте %%X, в чем проблема?
Цитата Masutin:
Один call для разных аргументов и команд? Так можно и надо? »
да
Это сообщение посчитали полезным следующие участники:

Отправлено: 03:52, 15-03-2021 | #8


Пользователь


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

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


Работает.
1) call тут не может быть менее 4-x? Разные команды и места назначения. B отличие от Baшeго кода, где результат команды преобразования представляла переменная.
2) Hecмотря на if exist, есть сообщение "Файл не найден". He ошибка?
Код: Выделить весь код
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" (
				call :#1 "%%X" "%dI%" "%dO%"
			)
			if "%%M"=="CFR" if "%%R"=="23.976" (
				call :#2 "%%X" "%dI%" "%dO%"
			)
			if "%%M"=="VFR" if not "%%R"=="23.976" (
				call :#3 "%%X" "%dI%" "%dO%" "%%R"
			)
			if "%%M"=="CFR" if not "%%R"=="23.976" (
				call :#4 "%%X" "%dI%" "%dO%" "%%R"
			)
		)
	)
)
:#1 [full *.(mkv,mp4)] [D:\Process] [D:]
	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 [full *.(mkv,mp4)] [D:\Process] [D:]
	for /f "tokens=1,2 delims=()" %%a in ("%~1") do (
		move "%~1" "%~3\%%~na (%%b)%%~xX"
	)
exit /b
:#3 [full *.(mkv,mp4)] [D:\Process] [D:] [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 [full *.(mkv,mp4)] [D:\Process] [D:] [not 23.976]
	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

Отправлено: 19:02, 17-03-2021 | #9


Ветеран


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

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


Цитата Masutin:
call тут не может быть менее 4-x? »
вам виднее, условия-то вы задаете
Цитата Masutin:
есть сообщение "Файл не найден". He ошибка? »
вероятно ошибка, делайте кусок подозрительного кода отдельным батником, тестируйте, доводите до ума. Ваше детище и с ним надо работать и чем больше вы будете самостоятельно его лелеять тем больше поймете и изучите и дополнительные хотелки будете прикручивать на ура.
Это сообщение посчитали полезным следующие участники:

Отправлено: 22:56, 17-03-2021 | #10



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
[решено] Не работают все браузеры Ashes Лечение систем от вредоносных программ 8 30-11-2017 09:37
Звук - Странно работают не все колонки, но в проверке по месту все в норме Andre4s11 Прочее железо 0 08-03-2015 18:06
2010 - Хочу все знать о WORD 2010 часть 7: нет работают все словоформы и т.д. test2235 Microsoft Office (Word, Excel, Outlook и т.д.) 6 04-11-2013 18:30
Не работают все ОЗУ 1dima93 Материнские платы и память 1 02-09-2013 23:13
Не работают все USB. vladim33 Материнские платы и память 6 06-03-2012 09:46




 
Переход