【Windows】batファイルの中でコマンドを実行するとなぜかbatファイルのパスが入ってしまう問題の原因と対処方法

 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ファイルのパスが挿入される問題を解決できます。

>株式会社シーポイントラボ

株式会社シーポイントラボ

TEL:053-543-9889
営業時間:9:00~18:00(月〜金)
住所:〒432-8003
   静岡県浜松市中央区和地山3-1-7
   浜松イノベーションキューブ 315
※ご来社の際はインターホンで「316」をお呼びください

CTR IMG