替换批处理文件可变供稿ffmpeg程序中的特殊字符

时间:2019-01-06 05:40:26

标签: batch-file ffmpeg

我正在尝试编写一个利用ffmpeg.exe的批处理文件,以将文件夹结构中的所有文件转换为mp3格式(具体为128 KBps)。

我的批处理文件目前无法处理包含某些特殊字符的文件名(通过串联%_SOURCE%%%~F变量来构造),从而产生以下错误:

没有此类文件或目录

  • 省略号
  • 破折号
  • 破折号
  • 减号

无效的参数

  • 弯曲的单引号
  • 弯曲的双引号

无效的参数(但有时会根据文件名中符号的位置而传递,例如,如果放置在{{1的nt之间, }}在Dont

  • C:\Users\Test\Documents\Input\Peter Bjorn And John - I Know You Dont Love Me.mp3连字符
  • -感叹号
  • !波浪号
  • ~非弯曲的单引号
  • '等于符号
  • =加号
  • +百分号
  • %开括号

如何修改批处理文件脚本,以使(变量正确地转义这些字符?

当前文件名输入示例:%%~F

所需的文件名输入示例:C:\Users\Test\Documents\Input\Peter Bjorn And John - I Know You Don't Love Me.mp3

脚本(请参见 C:\Users\Test\Documents\Input\Peter Bjorn And John - I Know You Don"^'"t Love Me.mp3 开头的行):

C:\ffmpeg\bin\ffmpeg.exe

1 个答案:

答案 0 :(得分:0)

@echo off
setlocal EnableExtensions DisableDelayedExpansion

rem // Define constants:
set "_SOURCE=C:\Users\Test\Documents\Input" & rem // (absolute source path)
set "_TARGET=C:\Users\Test\Documents\Output"  & rem // (absolute target path)
set "_PATTERN=*.*" & rem // (pure file pattern for input files)
set "_FILEEXT=.mp3"   & rem // (pure file extension of output files)

pushd "%_TARGET%" || exit /B 1

for /r "%_SOURCE%" %%F in ("%_PATTERN%") do (
    set "_fullpath=%%~F"
    set "_filename=%%~nF"
    call :ffmpeg
)

popd

endlocal
pause
exit /b


:ffmpeg
setlocal EnableDelayedExpansion

rem // Get target path and log path:
for %%A in ("!_fullpath:%_SOURCE%=.!") do (
    set "_logpath=%%~dpAffreport-!_filename!.log"
    set "_targetpath=%%~dpA"
)

for %%A in (_logpath _targetpath) do if not defined %%A (
    echo  ERROR: %%A not defined.
    exit /b 1
)

rem // Escape logpath:
set "_logpath=!_logpath:\=\\!"
set "_logpath=!_logpath::=\:!"
set "_logpath=!_logpath:'=\'!"
set "_logpath=!_logpath:%%=%%%%!"

rem // Set FFREPORT:
set "FFREPORT=file=!_logpath!:level=32"

rem // Make dir for the target file:
if not exist "!_targetpath!" md "!_targetpath!"

rem // Run ffmpeg command:
"C:\ffmpeg\bin\ffmpeg.exe" -hide_banner -report -n -i "!_fullpath!" -vn -c:a libmp3lame -b:a 128k "!_targetpath!\!_filename!%_FILEEXT%"
if not errorlevel 1 if exist "!_targetpath!\!_filename!%_FILEEXT%" del /f /q "!_fullpath!"

exit /b 0

在命令中使用for /f会改变文件名,如果 包含扩展ASCII(例如省略号)。

使用for /r来迭代文件可以得到更好的结果 并调整了代码以处理更改。

添加了标签:ffmpeg,以使其更易于使用 延迟的扩展变量等。

添加了_logpath变量以将日志文件路径与任何 反斜杠,冒号或单引号以反斜杠转义。 通过加倍来逃避百分号。

添加了_targetpath变量来存储ffmpeg的路径 是输出文件。 md命令用来建立目录 像输入一样的结构。

这可能无法解决所有问题。尽力做到不拖延 扩展虽然总是有一些失败,具体取决于 字符,即%

相关问题