我正在尝试编写一个利用ffmpeg.exe
的批处理文件,以将文件夹结构中的所有文件转换为mp3格式(具体为128 KBps)。
我的批处理文件目前无法处理包含某些特殊字符的文件名(通过串联%_SOURCE%
和%%~F
变量来构造),从而产生以下错误:
没有此类文件或目录
…
省略号–
破折号—
破折号−
减号无效的参数
‘
和’
弯曲的单引号“
和”
弯曲的双引号 无效的参数(但有时会根据文件名中符号的位置而传递,例如,如果放置在{{1的n
和t
之间, }}在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
答案 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
命令用来建立目录
像输入一样的结构。
这可能无法解决所有问题。尽力做到不拖延
扩展虽然总是有一些失败,具体取决于
字符,即%
。