Windowsのバッチファイル(batファイル)で特定のコマンドを実行する際、なぜかbatファイル自体のパスがコマンドに含まれてしまうことがあります。これは、コマンド内に”%0″(batファイルのパスを示す変数)が含まれていることが原因です。この問題は、”%0″を”%%0″のようにエスケープして記述することで解決します。
例えば次のコードは、動画ファイルをbatファイルにドラッグアンドドロップするとその動画ファイルを毎秒毎に画像化する ffmpeg を実行しようとするコードです。
@echo off REM ドラッグアンドドロップされたファイルのフルパスを取得 set "input=%~1" REM FFmpegを使用して動画ファイルと同フォルダにあるtmpフォルダに1秒間に1枚の画像を出力 ffmpeg -i "!input!" -vf fps=1 tmp\%03d.png pause
このコードを実行すると、以下のようなエラーが発生します。
[image2 @ 00000295cf929240] The specified filename 'C:\demo\置くと消える.mp4-tmp"C:\demo\test.bat3d.png' does not contain an image sequence pattern or a pattern is invalid. [image2 @ 00000295cf929240] Use a pattern such as %03d for an image sequence or use the -update option (with -frames:v 1 if needed) to write a single image. [image2 @ 00000295cf929240] Could not open file : C:\demo\置くと消える.mp4-tmp"C:\demo\test.bat3d.png av_interleaved_write_frame(): I/O error [out#0/image2 @ 00000295cf9eee00] Error muxing a packet
%0があるべき部分にbatファイルの名前が入ってしまっています。batファイルの”%0″はbatファイルのフルパスを表す変数であり、コマンドの”%03d.png”の先頭にある”%0″が展開されているわけです。そこで”%%0″と書いてエスケープします。
@echo off REM 日本語ファイル名対応 chcp 65001 REM ドラッグアンドドロップされたファイルのフルパスを取得 set "input=%~1" REM FFmpegを使用して動画ファイルと同フォルダにあるtmpフォルダに1秒間に1枚の画像を出力 REM ↓の ffmpeg -i "!input!" -vf fps=1 tmp\%%03d.png pause
このようにしてコマンド中に不要なbatファイルのパスが挿入される問題を解決できます。