在另一个命令之后,如何在批脚本中删除FOR循环中的文件



我用FFMPEG压缩视频,方法是用FOR LOOP批量编写一行代码。压缩后,我想删除原始文件。

这段代码完美地完成了压缩工作,但原始文件没有被删除:

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" ^| ^
"%__AppDir__%findstr.exe" /IR ".mp4$" ^| ^
"%__AppDir__%findstr.exe" /IRV "-small.mp4$"'
) Do @If Not Exist "%%~nG-small%%~xG" (
ffmpeg.exe -i "%%G" -vcodec libx265 -crf 28 "%%~nG-small%%~xG"
If Not ErrorLevel 1 If Exist "%%~nG-small%%~xG" Del /A /F "%%G")

其想法是获得一个目录列表,列出所有扩展名为.mp4的文件。使用第一个findstr排除与短名称(8.3(匹配的任何文件。然后,它将这些文件通过另一个findstr搜索进行管道传输,以排除任何已经在其基本名称后附加了-small的文件。接下来,它会进行检查,以确保该目录中没有现有文件,具有相同的基名称加上-small基名称后缀(防止可能的覆盖(。如果所有这些都通过了,则应调用ffmpeg.exe(前提是ffmpeg.exe在当前目录中,在%PATH%中,或在注册表中注册为可执行文件(。转换完成后,脚本将检查返回的ErrorLevel是否小于1(以确保成功(,如果是,则检查新文件是否存在(带有-small基名后缀(。如果是,它将使用Del命令继续删除。

如果你想再次尝试使用条件运算符而不是ErrorLevel,那么它看起来像这样:

@For /F "EOL=? Delims=" %%G In ('Dir /B /A:-D "*.mp4" ^| ^
"%__AppDir__%findstr.exe" /IR ".mp4$" ^| ^
"%__AppDir__%findstr.exe" /IRV "-small.mp4$"'
) Do @If Not Exist "%%~nG-small%%~xG" (
ffmpeg.exe -i "%%G" -vcodec libx265 -crf 28 "%%~nG-small%%~xG" && (
If Exist "%%~nG-small%%~xG" Del /A /F "%%G"))

我只是把'/f'放在DEL之后,它就完美地完成了任务。我不知道强制删除是否有任何缺点,但它是有效的。

最后一行:

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

最新更新