For loop 在执行另一个命令后,如何在批处理脚本中删除FOR循环中的文件?

For loop 在执行另一个命令后,如何在批处理脚本中删除FOR循环中的文件?,for-loop,batch-file,ffmpeg,For Loop,Batch File,Ffmpeg,我使用FFMPEG压缩视频,方法是使用FOR循环批量编写一行脚本。压缩后,我想删除原始文件 这段代码完美地完成了压缩任务,但未删除原始文件: for %%i in (*.mp4) do ffmpeg -i "%%i" -vcodec libx265 -crf 28 "%%~ni"-small.mp4&&del "%%i" pause 我错过了什么 顺便说一句,对于占用硬盘的任何类型的教育视频、教程等,这都是一个近乎完美

我使用FFMPEG压缩视频,方法是使用FOR循环批量编写一行脚本。压缩后,我想删除原始文件

这段代码完美地完成了压缩任务,但未删除原始文件:

for %%i in (*.mp4) do ffmpeg -i "%%i" -vcodec libx265 -crf 28 "%%~ni"-small.mp4&&del "%%i"
pause
我错过了什么


顺便说一句,对于占用硬盘的任何类型的教育视频、教程等,这都是一个近乎完美的压缩比。

我认为这种方法会更好地为您服务:

@For/F“EOL=?Delims=“%%G In('Dir/B/A:-D”*.mp4^|^
“%\uuu AppDir\uuu%findstr.exe”/IR“\.mp4$”^|^
“%\uu AppDir\uuu%findstr.exe”/IRV“\-small\.mp4$”'
)如果不存在,则执行“%%~nG small%%~xG”(
ffmpeg.exe-i“%%G”-vcodec libx265-crf 28“%%~nG small%%~xG”
如果不存在错误级别1如果存在“%%~nG小%%~xG”Del/A/F“%%G”)
其思想是获取扩展名为
.mp4
的所有文件的目录列表。使用第一个
findstr
排除与短(8.3)名称匹配的任何文件。然后,它通过另一个
findstr
搜索将这些文件进行管道传输,以排除那些已将
-small
附加到其基本名称的文件。接下来,它检查以确保该目录中没有具有相同basename加上
-small
basename后缀的现有文件(防止可能的覆盖)。如果所有这些都通过,则应调用
ffmpeg.exe
(前提是
ffmpeg.exe
位于当前目录中,在
%PATH%
内,或注册为可执行文件,并在注册表中具有其位置)。转换完成后,脚本将检查返回的
ErrorLevel
是否小于
1
(以确保转换成功),如果是,则检查新文件(带有
-small
basename后缀)是否存在。如果是,它将使用
Del
命令继续删除

如果您想使用条件运算符而不是ErrorLevel再次尝试,则它将如下所示:

@For/F“EOL=?Delims=“%%G In('Dir/B/A:-D”*.mp4^|^
“%\uuu AppDir\uuu%findstr.exe”/IR“\.mp4$”^|^
“%\uu AppDir\uuu%findstr.exe”/IRV“\-small\.mp4$”'
)如果不存在,则执行“%%~nG small%%~xG”(
ffmpeg.exe-i“%%G”-vcodec libx265-crf 28“%%~nG small%%~xG”&(
如果存在“%%~nG小%%~xG”Del/A/F“%%G”))

我只是在DEL后面加上了'/f',它很好地完成了这项工作。我不知道强制删除是否有任何缺点,但它是有效的

最后一行:

for %%i in (*.mp4) do ffmpeg -i "%%i" -vcodec libx265 -crf 28 "%%~ni"-small.mp4&&del /f "%%i"
pause

尝试这样的DO子句:
DO(ffmpeg-i“%%i”-vcodec libx265-crf 28“%%~ni small.mp4”&&del“%%i”)
除了@Squashman指出的方法外,还有很多方法可以做到这一点。您可以使用“enabledelayedexpansion”来允许您编写行,而不用担心它们是否成功。我自己更喜欢“。我的观点?做事情的方法有很多种,如果你需要不止一行的话,你可能需要使用不同的方法。你应该改进你的引用方式,将
“%%ni”-small.mp4
改为
“%%ni small.mp4”
…@Squashman,括号不应该有任何区别;可能
ffmpeg
将其退出代码设置为非零值,因此
&
不执行以下
del
命令;对于测试,我将暂时使用
&
而不是
&
…虽然很高兴看到您已经解决了它,但我在16小时前提供的答案中使用了
/F
选项和
Del
命令!除此之外,我还改进了您的脚本,并向您解释了它使用的方法。您没有接受它作为首选解决方案有什么特别的原因吗?@Compo我很感谢您的赞扬,它肯定比我的解决方案好。但我只需要一行代码就可以完成这项工作,并理解为什么我不能没有“/F”。我确实没有太注意你使用“/F”,因为whlole代码对我来说太难理解了。我将您的答案标记为解决方案。单行代码不会运行得更快,更难阅读,并且在您的情况下,对于真实场景来说不够健壮。在我的代码中,我没有添加任何不应该存在的内容,第二个示例也是一行程序。为了便于阅读,我简单地把长行分开。