現在、外部字幕ファイル(.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
ここでカウンターをインクリメントする方法はわかりませんが、主な問題は、テスト変数を呼び出したときにカウンターが表示されないことです。これに関する助けをいただければ幸いです。
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!"
に置き換えられ、遅延(実行)時間拡張を使用するようになりました