我试图使用FFMPEG将.flac的文件夹批量转换为.mp3,但当我运行批处理文件时,我得到了"%F此时是意外的"错误,尽管我在批处理文件中使用了"%%F"。为了测试真正的问题,我直接在cmd中键入%F的变体,但也无法使其工作。windows 10中关于for循环中变量名的使用是否发生了变化?
我尝试过的cmd命令:
C:UsersytMusicJoe Hisaishi (Classical Guitar) - Copy>for "%F" in (*.flac) echo %F
"%F" was unexpected at this time.
C:UsersytMusicJoe Hisaishi (Classical Guitar) - Copy>for %F in (*.flac) echo %F
echo was unexpected at this time.
C:UsersytMusicJoe Hisaishi (Classical Guitar) - Copy>for "%%F" in (*.flac) echo %%F
"%%F" was unexpected at this time.
C:UsersytMusicJoe Hisaishi (Classical Guitar) - Copy>for "%f" in (*.flac) echo %f
"%f" was unexpected at this time.
C:UsersytMusicJoe Hisaishi (Classical Guitar) - Copy>for "%g" in (*.flac) echo %g
"%g" was unexpected at this time.
C:UsersytMusicJoe Hisaishi (Classical Guitar) - Copy>for "%g" in ("*.*") echo %g
"%g" was unexpected at this time.
C:UsersytMusicJoe Hisaishi (Classical Guitar) - Copy>for "%g" in ("*.*") do echo %g
"%g" was unexpected at this time.
FFMPEG 的原始批处理文件
cd "UsersytMusicJoe Hisaishi (Classical Guitar) - Copy"
echo in directory "%cd%"
pause
for "%%F" in ("*.flac") do (
echo converting "%%F"
"C:UsersytDownloadsOtherAppsFFMPEGbinffmpeg.exe" -i "%%F" -codec:a libmp3lame -qscale:a 2 "%%~nF.mp3"
echo del "%%F"
)
cd "%~dp0"
不要使用
FOR "%F" ...
在命令行上,但
FOR %F ...
在脚本中,必须使用%%
而不是%
:
FOR %%F ...
但不是
FOR "%%F" ..
与"%G"
("%%G"
)的原理相同,使用%G
(%%G
)代替
使用以下批处理代码:
pushd "%USERPROFILE%MusicJoe Hisaishi (Classical Guitar) - Copy"
echo In directory "%cd%"
pause
for %%F in ("*.flac") do (
echo Converting "%%F" ...
"%USERPROFILE%DownloadsOtherAppsFFMPEGbinffmpeg.exe" -i "%%F" -codec:a libmp3lame -qscale:a 2 "%%~nF.mp3"
echo del "%%F"
)
popd
主要错误是使用"%%F"
在双引号中定义循环变量F
,这是不对的。循环变量的定义必须始终不使用双引号。只要在每个找到的文件上执行的命令或命令块中引用循环变量的值,就应该在文件名中有空格或&()[]{}^=;!'+,`~
的情况下使用双引号。
最好使用环境变量USERPROFILE
的值,而不是使用用户名硬编码文件夹路径。请参阅维基百科上关于Windows环境变量的文章。
使用命令pushd
和popd
比使用两次命令cd
更好地切换当前目录并稍后恢复。
上面的批处理文件不会删除转换后的*.flac文件,因为之前出于测试目的使用了命令echo
。
但是,可以在根本不切换当前目录的情况下编写此批处理代码。
for %%F in ("%USERPROFILE%MusicJoe Hisaishi (Classical Guitar) - Copy*.flac") do (
echo Converting "%%F" ...
"%USERPROFILE%DownloadsOtherAppsFFMPEGbinffmpeg.exe" -i "%%F" -codec:a libmp3lame -qscale:a 2 "%%~dpnF.mp3"
if not errorlevel 1 del "%%F"
)
此批处理代码在成功将*.flac文件转换为MP3格式后立即删除该文件。
注意:我没有安装ffmpeg.exe
,因此不知道它是否在成功时退出0
,在错误时退出值是否大于0
。
为了理解所使用的命令及其工作方式,请打开命令提示符窗口,在那里执行以下命令,并非常仔细地阅读为每个命令显示的所有帮助页面。
del /?
echo /?
for /?
if /?
popd /?
pushd /?
同时阅读Microsoft支持文章"在批处理文件中测试特定错误级别"。