web-dev-qa-db-ja.com

すべてのMKVファイルを検索し、すべての字幕を削除します

私は現在、 mkvmerge というWindowsプログラムを見ています。指定したパスからすべての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"

まだ頑張っていますが、誰か助けてくれたら本当にありがたいです。

5
David Custer

以下を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を使用して、すべてのMKVを%rootfolder%で再帰的に検索します。

  2. 次に、各MKVでmkvmerge -iを実行して、字幕トラックが存在するかどうかを確認します

  3. MKVに字幕トラックが含まれている場合は、mkvmerge -Sを実行して、そのようなトラックをすべてスキップしながらファイルをリマックスします。

  4. 最後に、mkvmergeの終了コードをチェックし、これ(つまり、errorlevel)が0で、警告/エラーなしで成功した場合は、元のファイルを削除します。

詳細については、コマンドプロンプトで mkvmergeドキュメント およびfor /?if /?などを参照してください。

8
Karan

おかげで、カラン、これは私にとっても非常に役に立ちました。スクリプトを変更して、保持したい字幕の言語(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
0
jutzin