我编写了这个脚本,但是它不起作用:
for /R %%f in (*.mkv) do (
ffmpeg -i "%%f" -vf subtitles="%%~nf.mkv" -acodec copy "%%~nf.mp4"
)
PAUSE
经过查找问题,我发现问题在于文件名,方括号必须转义(例如[1080p]coolvid.mp4
应该变成\[1080p\]coolvid.mp4
。我该如何对文件名(即%%f)这样做?
答案1
方括号必须转义
使用以下批处理文件:
@echo off
setlocal
setlocal enabledelayedexpansion
for /r %%f in (*.mkv) do (
set _a=%%~nf
set _b=!_a:[=\[!
set _name=!_b:]=\]!
set _c=%%f
set _d=!_c:[=\[!
set _fullname=!_d:]=\]!
ffmpeg -i "!_fullname!" -vf subtitles="!_name!.mkv" -acodec copy "!_name!.mp4"
)
endlocal
pause
进一步阅读
- Windows CMD 命令行的 AZ 索引- 与 Windows cmd 行相关的所有事物的绝佳参考。
- 启用延迟扩展- 延迟扩展将导致变量在执行时而不是在解析时扩展。
- 对于/r- 循环遍历文件(递归子文件夹)。
- 放- 显示、设置或删除 CMD 环境变量。使用 SET 所做的更改将仅在当前 CMD 会话期间保留。
- 变量编辑/替换- 编辑并替换分配给字符串变量的字符。
- FFmpeg 文档:引用和转义- 有关 的引用和转义的详细信息
ffmpeg
。
编辑:
如果遇到包含该!
字符的文件(或文件路径),原始代码将失败,因为已启用延迟扩展,并且 FOR 变量在延迟扩展之前进行扩展。因此,带有 的名称!
将被破坏。
通过在循环内切换延迟扩展 ON 和 OFF 可以轻松解决这个问题,这样在启用延迟扩展时不会扩展任何 FOR 变量。
@echo off
setlocal disableDelayedExpansion
for /r %%f in (*.mkv) do (
set _a=%%~nf
set _c=%%f
setlocal enableDelayedExpansion
set _b=!_a:[=\[!
set _name=!_b:]=\]!
set _d=!_c:[=\[!
set _fullname=!_d:]=\]!
ffmpeg -i "!_fullname!" -vf subtitles="!_name!.mkv" -acodec copy "!_name!.mp4"
endlocal
)
endlocal
pause