バッチの全角スペースに関するバグ
録画した TS をバッチファイルにドラッグアンドドロップして処理していたらコケた。なんでだろうと思ったらバッチ内でファイル名が正常に渡っておらず、ファイルがないよというエラーだった。
バッチファイルに特におかしなところはなさそうなのでちょっと調べてみた。
調査方法
echo %1 pause
こんなバッチファイルを作って c:\TEST\test.bat として保存。ここにファイルを投げてみる
DOS 窓を開いて実行してみる
DOS 窓 (コマンドプロンプト) を開いて手打ちでやってみる
C:\TEST>test.bat "c:\TEST\test test.txt" C:\TEST>echo "c:\TEST\test test.txt" "c:\TEST\test test.txt" C:\TEST>pause 続行するには何かキーを押してください . . .
うまく行くよね。ふつーに。
実験1.スペースを含まないファイルを投げてみる
"c:\TEST\testtest.txt" をドラッグアンドドロップしてみる。
C:\TEST>echo c:\TEST\testtest.txt c:\TEST\testtest.txt C:\TEST>pause 続行するには何かキーを押してください . . .
まぁうまく行くね。
実験2.全角スペースを含まず、半角スペースを含むファイルを投げてみる
"c:\TEST\test test.txt" をドラッグアンドドロップしてみる。
C:\TEST>echo "c:\TEST\test test.txt" c:\TEST\test test.txt C:\TEST>pause 続行するには何かキーを押してください . . .
ダブルクォートつきで渡されてうまく処理される。
実験3.全角スペース1個を含み、かつ半角スペースを含まないファイルを投げてみる
"c:\TEST\test test.txt" をドラッグアンドドロップしてみる。
C:\TEST>echo C:\TEST\test C:\TEST\test C:\TEST>pause 続行するには何かキーを押してください . . .
ダブルクォートつきで渡してくれないので、全角スペースのところで切れる。
実験4.全角スペースを含み、かつ半角スペースも含むファイルを投げてみる。
"c:\TEST\test test test.txt" (最初のスペースは全角で次のスペースは半角) をドラッグアンドドロップしてみる。
c:\TEST\test.bat に c:\TEST\test test test.txt をドラッグアンドドロップ C:\TEST>echo "C:\TEST\test test test.txt" "C:\TEST\test test test.txt" C:\TEST>pause
ダブルクォートつきで渡されて、ちゃんと処理される。ちなみに、 "c:\TEST Files\test test.txt" こんなふうにファイル名じゃなくディレクトリ名にスペースが入ってるときも問題なく処理してくれる。
実験結果
半角スペースを含まず、かつ全角スペースを含むとき、ファイル名がうまく渡らない。ググッてみたところこれは結構有名な仕様と言う名のバグのようで、対処するためのバッチスクリプトとかも見つけることができる。ただしバッチ文が結構長くなり、手間はかかる。ちなみに、今回は全角スペースに注目したけど、それ以外にもダメな文字は何種類かあるっぽい。
ファイル名に全角スペースや変な記号を好んで使う人は多くないと思うが、TS を録画しているときに番組名からファイル名をつけるようにしていると、たまにコレに引っかかる。実は今回こんなのが思いっきり引っかかった。
c:\Users\Administrator\Videos\2010031410000101-クロスゲーム 第48話「よし」[字].ts
「クロスゲーム」と「第48話」の間がどうみても全角スペースです。本当にry
実験4のように、ファイルのフルパス名に半角スペースを入れることによって運用的に対処することはできるようなので、録画ファイルのファイル名に半角スペースを必ず入れるようにするか、もしくは半角スペースを使ったディレクトリに置いておけば回避は可能。
例えば今までこんなところに置いていたなら…
変更前
"c:\Users\Administrator\Videos\"
変更後
"c:\Users\Administrator\Videos\ts data\"
こんなふうにファイル保存ディレクトリに半角スペースを含めてしまえば回避は可能。
もしくは、先程のクロスゲームの例だと『2010031410000101 クロスゲーム 第48話「よし」[字].ts』このようにファイル命名規則に半角スペースを必ず入れる (これだと数字と番組名の間) ようにすると、問題なく処理できるようになる。
だからどーしたと言われると困るんだけど、バッチにドラッグアンドドロップして作業することが多い人は覚えとくと吉かもしれない。