Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] He все условия работают (http://forum.oszone.net/showthread.php?t=348155)

Masutin 06-03-2021 19:06 2951904

He все условия работают
 
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")))))))))


alpap 06-03-2021 20:24 2951916

вся загвоздка где-то тут:
Код:

...            for /f "delims=) tokens=1" %%T in ("%%D") do (
покажите содержимое "D.txt" + возможные варианты
Код:

for /d %%D in (Process\*) do echo "%%D">>D.txt

alpap 09-03-2021 04:52 2952094

Цитата:

Цитата 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
и выложите содержимое файла
после этого будем о чем-то говорить.

alpap 11-03-2021 03:49 2952251

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

Masutin 12-03-2021 05:33 2952341

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.

alpap 13-03-2021 01:30 2952448

алгоритм конечно тот еще, бессвязный, неточный, имена все обобщены (ну сочту на то что составлялся пол пятого утра), например как может быть: 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


Masutin 15-03-2021 02:28 2952673

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 для разных аргументов и команд? Так можно и надо?

alpap 15-03-2021 03:52 2952677

Цитата:

Цитата Masutin
Нужна помощь c командой преобразования »

я в этом не спец
Цитата:

Цитата Masutin
%%X вместо %%F »

мне понравилось %%F, ставьте %%X, в чем проблема?
Цитата:

Цитата Masutin
Один call для разных аргументов и команд? Так можно и надо? »

да

Masutin 17-03-2021 19:02 2953020

Работает.
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


alpap 17-03-2021 22:56 2953059

Цитата:

Цитата Masutin
call тут не может быть менее 4-x? »

вам виднее, условия-то вы задаете
Цитата:

Цитата Masutin
есть сообщение "Файл не найден". He ошибка? »

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


Время: 19:31.

Время: 19:31.
© OSzone.net 2001-