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

时间:2017-01-14 09:50:46

标签: windows batch-file cmd ffmpeg

我试图使用FFMPEG将.flac的文件夹批量转换为.mp3,但是当我运行我的批处理文件时,我得到了“%F此时意外”错误,即使我使用了“%% F”在批处理文件中。为了测试真正的问题,我开始直接在%cm中键入%F的变体,但无法使其工作。在Windows 10中有关于在for循环中使用变量名称的更改吗?

我试过

cmd命令:

C:\Users\yt\Music\Joe Hisaishi (Classical Guitar) - Copy>for "%F" in     (*.flac) echo %F
"%F" was unexpected at this time.

C:\Users\yt\Music\Joe Hisaishi (Classical Guitar) - Copy>for %F in     (*.flac) echo %F
echo was unexpected at this time.

C:\Users\yt\Music\Joe Hisaishi (Classical Guitar) - Copy>for "%%F" in     (*.flac) echo %%F
"%%F" was unexpected at this time.

C:\Users\yt\Music\Joe Hisaishi (Classical Guitar) - Copy>for "%f" in     (*.flac) echo %f
"%f" was unexpected at this time.

C:\Users\yt\Music\Joe Hisaishi (Classical Guitar) - Copy>for "%g" in     (*.flac) echo %g
"%g" was unexpected at this time.

C:\Users\yt\Music\Joe Hisaishi (Classical Guitar) - Copy>for "%g" in     ("*.*") echo %g
"%g" was unexpected at this time.

C:\Users\yt\Music\Joe Hisaishi (Classical Guitar) - Copy>for "%g" in     ("*.*") do echo %g
"%g" was unexpected at this time.

FFMPEG的原始批处理文件

cd "\Users\yt\Music\Joe Hisaishi (Classical Guitar) - Copy"
echo in directory "%cd%"
pause
for "%%F" in ("*.flac") do (
echo converting "%%F"
"C:\Users\yt\Downloads\OtherApps\FFMPEG\bin\ffmpeg.exe" -i "%%F"     -codec:a libmp3lame -qscale:a 2 "%%~nF.mp3"
echo del "%%F"
)
cd "%~dp0"

2 个答案:

答案 0 :(得分:3)

不要使用

FOR "%F" ...

在命令行上,但

FOR %F ...

在脚本中,您必须使用%%代替%

FOR %%F ...

但不是

FOR "%%F" ..

"%G""%%G")的相同原则,使用%G%%G)代替

答案 1 :(得分:2)

使用以下批次代码:

pushd "%USERPROFILE%\Music\Joe Hisaishi (Classical Guitar) - Copy"
echo In directory "%cd%"
pause
for %%F in ("*.flac") do (
    echo Converting "%%F" ...
    "%USERPROFILE%\Downloads\OtherApps\FFMPEG\bin\ffmpeg.exe" -i "%%F" -codec:a libmp3lame -qscale:a 2 "%%~nF.mp3"
    echo del "%%F"
)
popd

主要的错误是使用F使用不正确的双引号定义循环变量"%%F"。必须始终定义循环变量,而不用双引号将其括起来。只是在每个找到的文件上执行的命令或命令块中引用循环变量的值时,如果是空格或文件名中有&()[]{}^=;!'+,`~,则应使用双引号。

最好使用环境变量USERPROFILE的值,而不是使用您的用户名对文件夹路径进行硬编码。请参阅Wikipedia关于Windows Environment Variables的文章。

使用命令pushdpopd最好切换当前目录,然后再恢复它,而不是使用命令cd两次。

由于命令echo之前用于测试目的,上述批处理文件不会删除已转换的* .flac文件。

但是可以在不切换当前目录的情况下编写这个批处理代码。

for %%F in ("%USERPROFILE%\Music\Joe Hisaishi (Classical Guitar) - Copy\*.flac") do (
    echo Converting "%%F" ...
    "%USERPROFILE%\Downloads\OtherApps\FFMPEG\bin\ffmpeg.exe" -i "%%F" -codec:a libmp3lame -qscale:a 2 "%%~dpnF.mp3"
    if not errorlevel 1 del "%%F"
)

此批处理代码在成功将文件转换为MP3格式后立即删除* .flac文件。

注意:我没有安装ffmpeg.exe,因此无法确定它是否在成功时以0退出并且值为{{1}错误。

要了解使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完全阅读为每个命令显示的所有帮助页面。

  • 0
  • del /?
  • echo /?
  • for /?
  • if /?
  • popd /?

另请阅读Microsoft支持文章Testing for a Specific Error Level in Batch Files