%a 和 %%a 突然分别在 Win 10 cmd 和批处理文件中不起作用?



我试图使用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环境变量的文章。

使用命令pushdpopd比使用两次命令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支持文章"在批处理文件中测试特定错误级别"。

最新更新