batch-file - Windows 批处理脚本在扫描文件夹中的文件时继续循环

标签 batch-file

我需要将子目录中的所有 MP4 文件转换为 MKV。所以我写了这个脚本:

@ECHO OFF
SET oldName=
SET newName=

FOR /r %%A IN (*.mp4) DO (
    SET oldName=%%A
    SET newName=%%A
    CALL :MAKEMKV
)

:MAKEMKV
SET newName=%newName:mp4=mkv%
IF NOT EXIST %newName% (
    START /B /WAIT ffmpeg -i "%oldName%" -map 0 -map -0:s -codec copy "%newName%"
)

问题是文件夹中只有第一个文件被转换然后退出。但是我使用 for do 循环。所以我不明白它为什么退出。

我的结构是:

/FOLDER
../A/filea.mp4
../B/fileb.mp4
../C/filec.mp4

当我运行上面的程序时,我只会将 filea.mp4 转换为 filea.mkv 并退出脚本。
其他文件 fileb.mp4filec.mp4 未被批处理文件转换。

我错过了什么?

最佳答案

在命令提示符窗口中运行 for/? 并阅读几页上的帮助输出。

实际上不需要批处理文件,因为这个任务可以从命令行完成:

for /R %I in (*.mp4) do @if not exist "%~dpnI.mkv" ffmpeg.exe -i "%I" -map 0 -map -0:s -codec copy "%~dpnI.mkv" && del "%%I"

批处理文件中的相同命令行:

@echo off
for /R %%I in (*.mp4) do if not exist "%%~dpnI.mkv" ffmpeg.exe -i "%%I" -map 0 -map -0:s -codec copy "%%~dpnI.mkv" && del "%%I"

我无法回答为什么您的批处理文件失败,因为不知 Prop 有真实文件夹名称和真实文件名称的文件夹结构。但是 Stephan 是正确的 IF NOT EXIST %newName% ( 如果文件名的完整路径包含空格或这些字符之一 &()[]{}^=;! '+,`~ 因为没有被双引号括起来。

注意 && del "%%I" 如果转换成功则删除刚刚转换的 *.mp4 文件和 ffmpeg.exe0 退出通常是成功的退出/返回代码。另请参阅 Single line with multiple commands using Windows batch file

如果再次编写带有子例程的批处理文件,请阅读 Where does GOTO :EOF return to?。有问题的批处理文件在 FOR 循环后遗漏了 goto :EOFexit/B 以避免落入 < strong>FOR 完成了。这在这里不是问题,但通常是不对的。

关于batch-file - Windows 批处理脚本在扫描文件夹中的文件时继续循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48248578/

相关文章:

batch-file - 批量发声?

c# - cmd批处理监听控制台应用程序的输出

python - 在 Python 中为 Maya (Windows 10) 运行批处理文件时无法识别 Imagemagick

variables - for 循环和变量

linux - 使用 Windows 批处理通过 OpenSSH 远程连接到 Linux

c++ - 在 VS cmd 提示符下运行 .bat 文件

batch-file - 批量不等于(不等)运算符

python - 批处理文件: Run command for every file of certain extension

batch-file - 如何使用批处理删除目录中的所有文件?

windows - 批处理文件中的错误处理