.bat 處理帶引號的檔名

做了一個很簡單的ffmpeg.bat檔案,作用只是用 FFMPEG 將指定的檔案重新處理一次,一開始內容很簡單:

d:\ffmpeg\bin\ffmpeg.exe -i "%1" -acodec copy "done\%1"

就執行ffmpeg.bat 檔名.mp4就可以了,結果有一天因為檔名有空格...

有空格就得用引號ffmpeg.bat "filename with spaces.mp4",這樣就出問題了,因為連引號都是 %1 的內容,真是讓人哭哭;最終解法..

setlocal chcp 65001 dir /b %1 > %TEMP%/__file set /p file=<%TEMP%/__file del %TEMP%/__file d:\ffmpeg\bin\ffmpeg.exe -i "%file%" -acodec copy "done\%file%"

重點在 chcp 和 dir /b;因為檔名不一定是 BIG5 能顯示的範圍之內,所以 dir /b 的檔名,不一定是正確的檔名 (dir 給他正確的檔名顯示,然後它回一個錯誤的...),所以要先改用 UTF8,然後利用 dir /b 去引號,就有個沒有引號的檔名可以拿來用了。

真是可喜可賀!

別忘了 WSL!

對,還有 WSL (Windows Subsystem for Linux),在 ffmpeg.bat 同一個目錄下建一個 ffmpeg.sh

#!/bin/sh file=$1 dir=`dirname $(readlink -fn $0)` cd $dir /mnt/d/ffmpeg/bin/ffmpeg.exe -i "$file" -acodec copy "done/$file"

還活不到一天的 ffmpeg.bat,就改成:

wsl /mnt/d/Videos/這是秘密/ffmpeg.sh %1

ffmpeg 可以在 Linux 裡面裝一個來用,我是用 Windows 的,因為 Linux 裡面的跑一半就 coredump,沒有查原因,就直接改用 Windows 版本的了。