web-dev-qa-db-ja.com

MKVToolNixを使用して字幕をMKVファイルにバッチマージします

現在、外部字幕ファイル(.assファイル)をmkvファイルにマージしようとしていますが、ループの問題に直面しています。

これに対する私の最新の試み:

set mkvmerge="C:\Program Files\MKVToolNix\mkvmerge.exe"  
set output_folder=G:\tada kun\muxed  
set counter = 01  
set test='G:\tada kun\subs\\[Kaya] Tada-Kun Wa Koi O Shinai - %counter% (Bd 1080P X.265 Flac).ass'  
for /r %%a in (*.mkv) do call %mkvmerge% -o "%output_folder%\%%~na.mkv"   --audio-tracks 1 --language 0:jpn --default-track 0:yes --language 1:jpn --default-track 1:yes  "%%a" --language 0:eng --default-track 0:yes "%test%" --attachment-name OpenSans-Semibold.ttf --attach-file ^"G:\tada kun\OpenSans-Semibold.ttf^"  --track-order 0:0,0:1,1:0

ここでカウンターをインクリメントする方法はわかりませんが、主な問題は、テスト変数を呼び出したときにカウンターが表示されないことです。これに関する助けをいただければ幸いです。

1
newguy1234

テスト変数を呼び出すと、counterが表示されません。

set counter = 01

これにより、counterという変数が作成されます(末尾のスペースに注意してください)。

これを行う正しい方法は次のとおりです。

set counter=01

また、値にスペースが含まれる可能性がある場合に対応するには、次のようにします。

set "counter=01"

ただし、あなたの場合(カウンターを使用)、別の形式のsetを使用する必要があります。

set /a counter=0

ここで、/aを使用すると、変数で算術式を使用できます。


ここでcounterをインクリメントする方法がわかりません。

使用する:

set /a counter+=1

値を取得するのは少し注意が必要です。まず、を使用して遅延拡張を有効にする必要があります

setlocal enabledelayedexpansion

これにより、変数を解析時ではなく実行時に評価できます。これを行わないと、ループ内の変数は、更新された値ではなく、初期値に展開されます。

次に、値を取得するには、!counter!の代わりに%counter%を使用します。

!counter!を使用する場合、行が実行されるたびに、またはforループ内のループごとに展開が実行されます。


すべてを一緒に入れて

@echo off
setlocal enabledelayedexpansion
set mkvmerge="C:\Program Files\MKVToolNix\mkvmerge.exe"  
set output_folder=G:\tada kun\muxed  
set /a counter=0
for /r %%a in (*.mkv) do (
  set "test=G:\tada kun\subs\\[Kaya] Tada-Kun Wa Koi O Shinai - !counter! (Bd 1080P X.265 Flac).ass"
  %mkvmerge% -o "%output_folder%\%%~na.mkv" --audio-tracks 1 --language 0:jpn --default-track 0:yes --language 1:jpn --default-track 1:yes "%%a" --language 0:eng --default-track 0:yes "!test!" --attachment-name OpenSans-Semibold.ttf --attach-file ^"G:\tada kun\OpenSans-Semibold.ttf^"  --track-order 0:0,0:1,1:0
  set /a counter+=1
  )
endlocal

注意:

  • set test...forループ内に移動され、"sの代わりに'sが使用されました。
  • "%test%""!test!"に置き換えられ、遅延(実行)時間拡張を使用するようになりました

参考文献

0
DavidPostill