如何解决在另一个命令之后,如何在批处理脚本中的FOR循环中删除文件?
我使用带有FOR LOOP的批处理脚本单线压缩方式用FFMPEG压缩视频。压缩后,我想删除原始文件。
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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。