FOR 循环仅执行 windows 延迟扩展的批处理文件中的最后一项

FOR loop only executes last item in windows Batch file with delayed expansion

我遇到了与 here 中提到的类似问题,但似乎我做的一切都是正确的,但仍然会发生这种情况。这是我的代码的错误部分,目的是使用 ffmpeg 从一种文件格式转换为另一种文件格式:

set    subfolder=converted
set   source_ext=.avi
set   target_ext=.mov

md %subfolder%
set path=%~dp0

setlocal enabledelayedexpansion
FOR %%I IN ("*!source_ext!") DO (
  echo 1 %%I
  set this_file=%%I
  echo 2 !this_file!
  set filename_new=!!this_file:%source_ext%=!!
  set output=!path!%subfolder%\!filename_new!!target_ext!)

  %ffmpegpath%\ffmpeg.exe -i "!this_file!" -vcodec copy -acodec copy "!output!"
    echo CONVERTED !this_file!
)

我正在寻找的输出是这样的:

1 file1.ext
2 file1.ext
CONVERTED file1.ext
1 file2.ext
2 file2.ext
CONVERTED file2.ext
1 file3.ext
2 file3.ext
CONVERTED file3.ext

奇怪的是,我得到的是:

1 file1.ext
2 file1.ext
1 file2.ext
2 file2.ext
1 file3.ext
2 file3.ext
CONVERTED file3.ext

我难住了!

您的错误是由于在 ffmpeg 命令行之前错误地放置了一个右括号。只需删除括号即可解决问题。

您的脚本仅使用延迟扩展来将不必要的命令回显到提示 window,因此我在下面的重写中删除了这些内容。

If Not Exist "%ffmpegpath%\ffmpeg.exe" GoTo :EOF

Set "subfolder=converted"
Set "source_ext=.avi"
Set "target_ext=.mov"

If /I Not "%CD%\"=="%~dp0" CD /D "%~dp0"

If Exist *%source_ext% (
    If Not Exist "%subfolder%" MD "%subfolder%"
) Else GoTo :EOF

For %%A In ("*%source_ext%") Do (
    "%ffmpegpath%\ffmpeg.exe" -i "%%A" -vcodec copy -acodec copy "%subfolder%\%%~nA%target_ext%"
)