& が私のバッチファイルを混乱させた

録画したファイルの処理で...

SET OUTDIR=C:\out\
SET OUTNAME=%~n1.mp4
encode.exe %1 "%OUTDIR%%OUTNAME%"

みたいなとことしていたところに、引数で「"c:\src\a&b.ts"」のような"&"が入ったファイル名が渡されたら...

SET OUTNAME=a&b.mp4

となってしまう。これは実際には

SET OUTNAME=a

のあとに

b.mp4

が実行されてしまうから、期待通りに動かない。
これを解決するために "" で囲めばいいじゃんと思ったりする。

SET OUTNAME="%~n1.mp4"

これでうまくいきそうにみえるけど、実際はこんな感じに "" がへんなところに入って残念なことに。

encode.exe "c:\src\a&b.ts" "c:\out\"a&b.mp4""


で、やり方を変えた。こんな感じに。

CALL :ENCODE %1 "c:\out\"
GOTO :EOF

:ENCODE
encode.exe %1 "%~dp2%~n1.mp4"
GOTO :EOF

CALLを使うとパラメータが %1〜9 でアクセスできて、CALLされた側でも %~dpn1 みたいな処理が書けるから便利。


今月から & で困ってる人が多いかもと思って日記に(笑)
前にも書いたけど %~1 とか %~dp2 とかの意味は CALL /? で簡単に調べられる。おすすめ。