我想替换批处理文件中的当前文件名
for %%a in ("*.mp4") do ffmpeg -i "%%~a" -vf "drawtext=text=%%~na:fontfile='C\:\\Users\\harin\\Desktop\\test\\Fonts\\Glamy Sunrise.ttf':fontcolor=black:fontsize=54:x=20:y=50" -b:v 1M -r 60 -b:a 144k -crf 17 "C:\Users\harin\Desktop\test\in\Working\1\%%~na.mp4"
需要用这样的东西替换
drawtext=text=%%~na
drawtext=text=str_replace(array('-','_'),array(' ',''),%%~na)
我该怎么做...thx
文件名的修改可以使用延迟变量扩展来完成:
@echo off
setlocal EnableExtensions DisableDelayedExpansion
for %%I in (*.mp4) do (
set "FullFileName=%%I"
set "OnlyFileName=%%~nI"
setlocal EnableDelayedExpansion
set "OnlyFileName=!OnlyFileName:_=!"
set "OnlyFileName=!OnlyFileName:-= !"
ffmpeg.exe -i "!FullFileName!" -vf "drawtext=text=!OnlyFileName!:fontfile='C\:\\Users\\harin\\Desktop\\test\\Fonts\\Glamy Sunrise.ttf':fontcolor=black:fontsize=54:x=20:y=50" -b:v 1M -r 60 -b:a 144k -crf 17 "C:\Users\harin\Desktop\test\in\Working\1\!OnlyFileName!.mp4"
endlocal
)
endlocal
假设批处理文件执行时的当前目录不是目录
C:\Users\harin\Desktop\test\in\Working\1
,因为在这种情况下,应修改 FOR 命令行来处理首先加载到 cmd.exe
内存中的文件名列表在运行 FOR 体内的命令之前。这可以通过使用第三行来实现:
for /F "eol=| delims=" %%I in ('dir *.mp4 /A-D-L /B 2^>nul') do (
如果当前目录下不存在文件名包含一个或多个感叹号的MP4文件,则批处理文件代码可以优化为以下代码。
@echo off
setlocal EnableExtensions EnableDelayedExpansion
for %%I in (*.mp4) do (
set "FileName=%%~nI"
set "FileName=!FileName:_=!"
set "FileName=!FileName:-= !"
ffmpeg.exe -i "%%I" -vf "drawtext=text=!FileName!:fontfile='C\:\\Users\\harin\\Desktop\\test\\Fonts\\Glamy Sunrise.ttf':fontcolor=black:fontsize=54:x=20:y=50" -b:v 1M -r 60 -b:a 144k -crf 17 "C:\Users\harin\Desktop\test\in\Working\1\!FileName!.mp4"
)
endlocal
要了解所使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完整、仔细地阅读每个命令显示的帮助页面。
echo /?
endlocal /?
for /?
set /?
setlocal /?
注意: 如果完整路径包含空格或这些字符之一
ffmpeg.exe
,则指定 "
及其完全限定文件名括在 &()[]{}^=;!'+,`~
中是最有效的,在这种情况下 cmd.exe
不会需要使用环境变量 ffmpeg.exe
和 PATH
在每个 *.mp4 文件上搜索文件 PATHEXT
。