str_replace%%~na批处理文件中的文件名



我想替换批处理文件中的当前文件名

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不需要使用环境变量PATHPATHEXT在每个*.mp4文件上搜索文件ffmpeg.exe

相关内容

最新更新