質問: Windows 7のデスクトップで、Handbrakeを用いて多数のビデオファイルのエンコーディングを行おうとしています。 GUI版ではキューを利用したバッチ処理が可能ですが、プロファイルを利用しても多数のビデオを同じ設定でエンコードするには非常に手間がかかります。(具体的には、音声トラック指定やチャプターが引き継がれない上、ハングするとキューがリセットされてしまうため、再度設定しなおしになります) そこで、HandbrakeのCUI版を用いて、こちらでバッチ処理で一括エンコードをさせようと考えています。 しかし、CUI版にはキューが実装されていないため、エンコードが終わり次第、手動でエンコードを開始する必要があります。 バッチでまとめて処理することも考えましたが、以下の問題があります。 ・該当ファイルが数百あるため、バッチファイル内に処理対象を記入したり、ドラッグアンドドロップで対処しようとすると、抜け漏れが発生したことに気づかない恐れがある。 ・フォルダ内の一部のファイルのみがエンコード対象であるため、forを用いたフォルダ直下全てに対する処理ができない。(該当ファイルだけを一時的に作業用フォルダに移すことは環境上難しいです) ・バッチから起動した場合、処理している途中でハングしてしまうと、どのファイルまで処理されたかがすぐには分からなくなってしまう。 そこで、ジョブ・キューによる実行を行いたいと考えました。 想定する流れは以下の通りです。 ・エンコードするコマンドをバッチ1として記述する。(済) ・バッチ1に引数としてファイル名を与えたものをジョブとしてキューに登録するバッチ2を作る。 ・バッチ2にファイルをドラッグアンドドロップし、バッチ1+ファイル名をキューに追加する。 ・キューが空になるまでエンコードを行う。同時に実行されるHandbrakeは1つとし、1つのファイルのエンコードが終わったら次のファイルのエンコードを開始する。 ・キュー内のジョブは後から確認・追加・キャンセルを行える。 ただ、肝心のキューを実現する方法が分からず、どう実装すれば解決できるのか、途方に暮れています。 Windows上で完結し、かつできるだけ簡便に、ジョブ・キュー機能を使ってエンコードするには、どのようにすればよいでしょうか。
回答: テキストファイルもバッチファイルで簡易キューとして使えますよ。 編集も容易ですし。 ファイル名をテキストファイルに追加 ex)バッチ2.bat [ファイル名] ``` echo %1>>q.txt ``` テキストファイルからファイル名を1行ずつ取得してサブルーチンに渡す ex)run.bat ``` for /F "usebackq tokens=* delims=," %%i in (`type q.txt`) do call :SUB "%%~i" exit /b :SUB set FILE_NAME=%~1 echo %FILE_NAME%> 処理中.log rem 処理 call バッチ1.bat %FILE_NAME% if errorlevel 1 EXIT /b 1 echo %FILE_NAME%>>処理終了.log echo type null > 処理中.log goto :EOF ``` 後はfc辺りで差分取れば未実行ファイル一覧が取れる ``` fc /C /L q.txt 処理終了.log ```