다른 폴더에서 .mp4 및 .srt를 재귀적으로 다중화하는 배치 파일

다른 폴더에서 .mp4 및 .srt를 재귀적으로 다중화하는 배치 파일

다음 폴더 구조에 따라 별도의 폴더에 .srt 하위 항목이 포함된 x265 .mp4로 TV와 영화를 릴리스하는 토렌트의 새로운 추세가 있습니다.

Season1\title1.mp4
Season1\title2.mp4
Season1\title3.mp4
Season1\Subs\title1\subfile1.srt
Season1\Subs\title1\[subfile2.srt]
Season1\Subs\title1\[subfile3.srt]
Season1\Subs\title2\subfile1.srt
Season1\Subs\title2\[subfile2.srt]
Season1\Subs\title2\[subfile3.srt]
Season1\Subs\title3\subfile1.srt
Season1\Subs\title3\[subfile2.srt]
Season1\Subs\title3\[subfile3.srt]

내 목표는 각 .mp4를 하위 폴더의 첫 번째 .srt로 다중화하는 것입니다.MKVToolNix GUI를 사용하여 한 번에 하나씩 이 작업을 수행할 수 있지만 배치 파일(또는 PowerShell 스크립트)을 사용하여 이 작업을 수행하는 더 간단하고 빠른 방법을 찾고 있었습니다. 다음 두 가지 솔루션이 가깝습니다.

MP4 및 SRT 파일을 MKV로 일괄 병합/다중화

.mkv 파일과 일괄 병합/mux .srt

하지만 .mp4와 .srt가 동일한 폴더에 있고 제목이 적절할 경우에만 작동합니다. 내 문제는 다른 많은 사람들도 처리해야 하는 문제인데, 새로운 릴리스 표준에서는 다음과 같습니다.

  • .mp4와 .srt는 다른 폴더에 있습니다.
  • 모든 .mp4에 대해 하나 이상의 .srt 파일이 있을 수 있습니다. 이 경우 일반적으로 기본 영어 하위 파일인 첫 번째 .srt 파일을 원한다고 가정하는 것이 안전합니다.
  • .srt 파일은 첫 번째 파일의 제목이 항상 같은 명명 규칙을 따르지 않습니다. 즉, 배치 파일은 이름에 관계없이 첫 번째 .srt를 사용해야 합니다.

이 2018년 스크립트는수제이 파드케, 좋은 시작입니다.

for %%f in (*.mkv) do (
    echo %%~nf
    'C:\Program Files\MKVToolNix\mkvmerge.exe' -o "%%~nf_New.mkv" "%%~nf.mkv" --language 0:eng "%%~nf.srt"
    move /Y "%%~nf_New.mkv"  "%%~nf.mkv"

모든 파일(.mp4 및 .srt)이 동일한 폴더에 있고 제목이 적절하다면 반복적으로 작동합니다. 하지만 내가 찾고 있는 것은 파일 이름을 바꾸거나 파일을 이동하지 않는 배치 파일입니다. mkvmerge.exe를 사용하여 각 .mp4를 하위 폴더의 첫 번째 .srt로 다중화하고 각각의 새 .mkv를 .mp4와 동일한 폴더에 저장합니다.

선택적으로 이것을 알아낼 수 있으므로 Mkvmerge.exe는 .srt를 다음과 같이 설정해야 합니다.언어:영어그리고DefaultTrack 플래그를 강제로 적용합니다..

한 시즌의 모든 .mp4 파일에 대해 작동합니다. 당신이 근면함을 느끼지 않는 한, 계절마다 일할 필요는 없습니다. 그런 다음 각 시즌의 .mp4 파일과 동일한 폴더에서 각 시즌에 대한 배치 파일을 실행합니다.

설명이 길어서 죄송합니다. 하지만 이건 제가 할 수 있는 일이 아니며, 여러분의 도움이 필요합니다. 어떤 제안이라도 감사드립니다.

답변1

@echo off 

setlocal && cd /d "%~dp0"
set "_mkv=C:\Program Files\MKVToolNix\mkvmerge.exe"
set "_flag_0=--default-language en --language 0:en"
set "_flag_1=--priority higher --flush-on-close --disable-track-statistics-tags -o"

for /f usebackq^delims^= %%G in (`dir /a:d /b ^|findstr Season.*[0-9] ^|find/v /i "\subs\"
   `)do if exist "%%G\*.mp4" for /f usebackq^delims^= %%i in (`2^>nul where "%%~G:*.mp4"
        `)do call %:^) "%%~G" "%%~ni" "%%~i" "%_mkv%" "%_flag_0%" "%_flag_1%" "*.srt"

%:^)
if "%~1" == "" (endlocal & goto :eof)else for /f ^usebackq^delims^= %%# in (`2^>nul ^
     where "%~1\Subs\%~2:%~7"`)do "%~4" %~6 "%~dpn3.mkv" "%~3" %~5 "%%~f#" & exit /b
     

1.이 박쥐를 기본/루트( SeasonX\폴더 위의 1레벨:)에 저장합니다.

2.루프를 사용하여 for /f각 폴더의 전체 경로를 얻으십시오.SeasonX\

삼.해당 폴더에 가 있으면 any/more.mp4이번에는 해당 경로도 가져옵니다.

4./flags필요한 mkv와 mkv 실행 파일의 전체 경로도 저장하고 함수 내부에서 사용하십시오 ( :label)

5.첫 번째 자막\file.srt가 발견되면 mp4를 처리하고 즉시 함수를 종료하기 위해 사용할 인수를 이미 구성하고 있는 함수를 호출합니다.


관찰: 1.하위 폴더를 필터링 Findstr하고 폴더 이름 레이아웃과 일치하는 모든 항목에서 실행되도록 허용하며, 시나리오에 가장 적합한 옵션을 확인하기 위한 몇 가지 옵션 아래에 있습니다.

dir /a:d /b | findstr /ei Season.[0-9]       |find/v /i "\subs\"
dir /a:d /b | findstr /ei Season.*[0-9]      |find/v /i "\subs\"
dir /a:d /b | findstr /ei Season[0-9][0-9]   |find/v /i "\subs\"
dir /a:d /b | findstr /ei Season.[0-9][0-9]  |find/v /i "\subs\"
dir /a:d /b | findstr /ei Season.*[0-9][0-9] |find/v /i "\subs\"

관찰: 2.bat에서 함수를 호출할 때 변수/문자열을 (인수로) 전달하여 이를 사용할 수 있도록 해야 합니다.

::  call :label/function and passing all arguments
:: 
::  call %:^) "%%~G" "%%~ni" "%%~i" "%_mkv%" "%_flag_0%" "%_flag_1%" "* .srt"
::  call %:ˆ) "Season1" "title1" "C:\Users\Answer42\Videos\SU-2022\Season1\title1.mp4" "C:\Program Files\MKVToolNix\mkvmerge.exe" "--default-language en --language 0:en" "--priority higher --flush-on-close --disable-track-statistics-tags -o" "*.srt"
:: 
:: ------------------------------------------------------------------------------- ::
::
:: %1  ==      "%%~G" == folder where .mp4 files are
:: %2  ==     "%%~ni" == the name without extension for the current mp4
:: %3  ==      "%%~i" == the full path to the current mp4 file
:: %4  ==    "%_mkv%" == the full path to the mkvmerge executable
:: %5  == "%_flag_0%" == mkv flag for process the first subtitle :: input in loop
:: %6  == "%_flag_1%" == mkv flag to process and output file
:: %7  ==     "*.srt" == subtitle extension
:: 
:: ------------------------------------------------------------------------------- ::

관찰: 3.루프 내부(함수/레이블 내부) 명령 for /f과 인수를 사용하여 for 루프에서 얻은 결과:

for /f ... (`where "%~1\Subs\%~2:%~7"`)do...
for /f ... (`where "C:\Users\Answer42\Videos\SU-2022\Season1\Subs\title1:*.str`)do...

...)do "%~4" %~6 "%~dpn3.mkv" "%~3" %~5 "%%~f#"
...)do "C:\Program Files\MKVToolNix\mkvmerge.exe" --priority higher --flush-on-close --disable-track-statistics-tags -o "C:\Users\Answer42\Videos\SU-2022\Season1\title1.mkv" "C:\Users\Answer42\Videos\SU-2022\Season1\title1.mp4" --default-language en --language 0:en "C:\Users\Answer42\Videos\SU-2022\Season1\Subs\title1\subfile1.srt"


내 목표는 각 .mp4를 하위 폴더의 첫 번째 .srt로 다중화하는 것입니다.

이 코드를 사용하는 가장 까다로운 부분은 올바른 자막으로 돌아가는 명령을 조정하는 것입니다....

  • 우리는 무엇을 목표에 맞게 출력해야 할지 모르고 파일, 파일 이름, 생성/변경 날짜 또는 해당 내용도 보지 못했다는 점을 이해하십시오.

  • 따라서 무엇이 첫 번째(또는 english.str)인지 정의하기 어렵기 때문에 필요한 경우 이 부분으로 가서 조정을 수행하고 함수의 현재 명령을 아래 가능한 명령 중 하나로 대체합니다.

%:^)
if "%~1" == "" (endlocal & goto :eof)else for /f ^usebackq^delims^= %%# in (`2^&>nul ^
     where "%~1\Subs\%~2:%~7"`)do "%~4" %~6 "%~dpn3.mkv" "%~3" %~5 "%%~f#" & exit /b

:: Possible adjustments/replacement/in command:
     where "%~1\Subs\%~2:%~7"`)do...

     where "%~1\Subs\%~2:%~7"^|sort`)do...
     where "%~1\Subs\%~2:%~7"^|sort /r`)do...

     dir /b /a:-d /on /s "%~1\Subs\%~2\%~7"`)do...
     dir /b /a:-d /o-n /s "%~1\Subs\%~2\%~7"`)do...

     dir /b /a:-d /od /tc /s "%~1\Subs\%~2\%~7"`)do...
     dir /b /a:-d /o-d /tc /s "%~1\Subs\%~2\%~7"`)do...

     dir /b /a:-d /on /s "%~1\Subs\%~2\%~7" ˆ|sort /r`)do...
     dir /b /a:-d /o-n /s "%~1\Subs\%~2\%~7" ˆ|sort /r`)do...

     dir /b /a:-d /od /tc /s "%~1\Subs\%~2\%~7" ^|sort`)do...
     dir /b /a:-d /o-d /tc /s "%~1\Subs\%~2\%~7" ^|sort /r`)do...

관련 정보