5

В настоящее время я смотрю на программу Windows под названием mkvmerge. Я хотел бы создать пакетный файл, чтобы рекурсивно найти все файлы MKV по указанному пути, и удалить все субтитры из найденных файлов MKV (если найденный MKV содержит субтитры), наконец, удалив все исходные файлы MKV, для которых были удалены субтитры.

Я потратил около 2 часов на поиски в Интернете и обнаружил, что вы должны быть в состоянии написать что-то вроде этого:

FOR /F "delims=*" %%A IN ('dir /b *.MKV') DO "C:\mkvmerge.exe" -o "fixed_%%A" -a 4 -s 7 --compression -1:none "%%A"

Я все еще пытаюсь, но если кто-то может помочь мне, я буду очень признателен.

2 ответа2

8

Сохранить следующее как что - то вроде DelMKVSubs.bat в том же каталоге mkvmerge.exe находится, отредактировать переменную RootFolder в соответствии с вашими требованиями и запустить пакетный файл:

@echo off
cls
set rootfolder=C:\
echo Enumerating all MKVs under %rootfolder%
echo.
for /r %rootfolder% %%a in (*.mkv) do (
    for /f %%b in ('mkvmerge -i "%%a" ^| find /c /i "subtitles"') do (
        if [%%b]==[0] (
            echo "%%a" has no subtitles
        ) else (
            echo.
            echo "%%a" has subtitles
            mkvmerge -q -o "%%~dpna (No Subs)%%~xa" -S "%%a"
            if errorlevel 1 (
                echo Warnings/errors generated during remuxing, original file not deleted
            ) else (
                del /f "%%a"
                echo Successfully remuxed to "%%~dpna (No Subs)%%~xa", original file deleted
            )
            echo.
        )
    )
)

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

  1. Он использует for /r для рекурсивного поиска %rootfolder% для всех MKV

  2. Затем он запускает mkvmerge -i на каждом MKV, чтобы проверить, существует ли дорожка субтитров.

  3. Если MKV содержит дорожки субтитров, он запускает mkvmerge mkvmerge -S для повторного смешивания файла, пропуская все такие дорожки

  4. Наконец, он проверяет код errorlevel и, если это (то есть уровень ошибки ) равен 0, что указывает на успех без предупреждений / ошибок, он удаляет исходный файл

Для получения дополнительной информации см. Документацию mkvmerge, а также for /? , if /? и т.д. в командной строке.

0

Спасибо, Каран, это тоже было очень полезно для меня. Я изменил ваш скрипт так, что теперь вы можете выбрать язык (указанный в 3LC (eng, ned, swe и т.д.)) Для субтитров, которые вы хотели бы сохранить. Кроме того, я удалил часть, где удаляются входные файлы, и решил добавить суффикс к выходному файлу.

Вот моя версия:

:: remux all mkvs under a certain subfolder with all subitles
:: but those as specified by %language% parameter removed.

@echo off
setlocal enabledelayedexpansion

:: set your variables here
set rootfolder="C:\temp\New folder"
set language=eng
set suffix= (eng sub)

:: do the remuxing
echo Remuxing all mkvs in %rootfolder% and its subfolders.
for /r %rootfolder% %%a in (*.mkv) do (
    set subs=
    set mkv=%%a
    for /f "tokens=3 delims=: " %%b in ('mkvmerge -I "%%a" ^| findstr /i /r ".*subtitles.*language:%language%.*"') do (
        set subs=!subs!,%%b
    )
    for /f "tokens=*delims=," %%c in ("!subs!") do (
        set subs=%%c
    )
    if not exist "%%~dpna%suffix%%%~xa" if not "!subs!"=="" (
        mkvmerge -q -o "%%~dpna%suffix%%%~xa" -s !subs! "%%a"
        if errorlevel 1 (
            echo Warnings/errors generated during remuxing of "%%a".
        ) else (
            echo Successfully remuxed to "%%~dpna (eng subs)%%~xa".
        )
    ) else (
        echo Input file "%%a" has no subtitles in %language% or output file "%%~dpna%suffix%%%~xa" already exists. Skipping this file.
    )
)
pause

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .