我想替换批处理文件中的当前文件名
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:UsersharinDesktoptestinWorking1%%~na.mp4"
需要用类似drawtext=text=str_replace(array('-','_'),array(' ',''),%%~na)
的东西替换drawtext=text=%%~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:UsersharinDesktoptestinWorking1!OnlyFileName!.mp4"
endlocal
)
endlocal
假设批处理文件执行时的当前目录不是目录C:UsersharinDesktoptestinWorking1
,因为在这种情况下,在运行FOR正文内的命令之前,应修改FOR命令行,以处理首先加载到cmd.exe
内存中的文件名列表。这可以通过使用作为第三行来实现:
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:UsersharinDesktoptestinWorking1!FileName!.mp4"
)
endlocal
要了解所使用的命令及其工作方式,请打开命令提示符窗口,在那里执行以下命令,并完整仔细地阅读每个命令显示的帮助页。
echo /?
endlocal /?
for /?
set /?
setlocal /?
注意:如果完整路径包含空格或其中一个字符&()[]{}^=;!'+,`~
,则指定ffmpeg.exe
并将其完全限定的文件名括在"
中是最有效的,因为在这种情况下,cmd.exe
不需要使用环境变量PATH
和PATHEXT
在每个*.mp4文件上搜索文件ffmpeg.exe
。