找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 1166|回复: 3

[文件操作] 批处理如何批量删除文件夹里时长小于指定秒数的视频?

[复制链接]
发表于 2025-10-31 22:34:31 | 显示全部楼层 |阅读模式
bat和多个文件夹在同一个目录下,每个文件夹有若干视频,需要批量删除文件夹里时长小于指定秒数的视频,比如7秒。最好能在运行的时候自己输入秒数。

用deepseek试写了一个并不能运行,大佬帮忙优化一下,看是哪里的问题,也已经把ffmpeg软件和bat放一起了,再次感谢了

代码如下:
  1. @echo off
  2. setlocal enabledelayedexpansion

  3. :: 设置视频时长阈值(秒)
  4. set "threshold=7"

  5. :: 获取当前文件夹路径
  6. set "current_dir=%cd%"

  7. :: 遍历当前目录及所有子目录下的MP4文件
  8. for /R "%current_dir%" %%f in (*.mp4) do (
  9.     :: 使用FFmpeg获取视频时长
  10.     for /f "tokens=1 delims=." %%d in ('ffmpeg -i "%%f" 2>&1 ^| findstr "Duration"') do (
  11.         set "duration=%%d"
  12.         set "duration=!duration: =!"
  13.         
  14.         :: 提取时长的小时、分钟和秒部分
  15.         for /f "tokens=1-3 delims=:" %%h in ("!duration!") do (
  16.             set "hours=%%h"
  17.             set "minutes=%%i"
  18.             set "seconds=%%j"
  19.         )
  20.         
  21.         :: 计算总时长(秒)
  22.         set /a total_seconds = hours * 3600 + minutes * 60 + seconds
  23.         
  24.         :: 如果时长小于阈值,则删除文件
  25.         if !total_seconds! lss %threshold% (
  26.             echo Deleting %%f (Duration: !total_seconds! seconds)
  27.             del "%%f"
  28.         )
  29.     )
  30. )

  31. endlocal
  32. pause
复制代码
发表于 2025-10-31 23:32:59 | 显示全部楼层
  1. @echo off
  2. setlocal enabledelayedexpansion

  3. REM 设置视频时长阈值(秒)
  4. set "threshold=7"

  5. REM 获取当前文件夹路径
  6. set "current_dir=%cd%"

  7. REM 遍历当前目录及所有子目录下的MP4文件
  8. for /R "%current_dir%" %%A in (*.mp4) do (
  9.     REM 使用FFmpeg获取视频时长
  10.     for /f "tokens=2-4 delims=:. " %%d in ('ffmpeg -i "%%A" 2^>^&1 ^| findstr "Duration"') do (
  11.         REM 计算总时长(秒)
  12.         set /a "total_seconds=(1%%d-100)*3600+(1%%e-100)*60+(1%%f-100)"
  13.         REM echo total_seconds=!total_seconds!
  14.         REM 如果时长小于阈值,则删除文件
  15.         if !total_seconds! lss %threshold% (
  16.             echo Deleting %%A [Duration: !total_seconds! seconds]
  17.             del "%%A"
  18.         )
  19.     )
  20. )

  21. endlocal
  22. pause
复制代码
发表于 2025-11-1 11:42:19 | 显示全部楼层
本帖最后由 aloha20200628 于 2025-11-1 11:59 编辑

回复 1# 盛世繁华

以下代码中第一行设置 '时长限值',假设为7秒,格式如 00:00:07

  1. @echo off &setlocal &set "t=00:00:07"
  2. for /f "delims=" %%F in ('dir /b/s/a-d *.mp4') do for /f "tokens=2 delims=., " %%t in ('ffmpeg.exe -hide_banner -i "%%F" 2^>^&1^|find /i "duration:" ') do if "%%t" lss "%t%" (echo,Deleting %%F [%%t] &del /q "%%F")
  3. pause&exit/b
复制代码
发表于 2025-11-1 15:06:48 | 显示全部楼层
我把1楼第一句话发给chatgpt,给了个这个,有点错误但是不影响使用。
  1. @echo off
  2. setlocal enabledelayedexpansion

  3. :: 设置阈值秒数,例如7秒
  4. set "LIMIT=7"

  5. echo 正在扫描当前目录下的所有视频文件,删除时长小于 %LIMIT% 秒的文件...
  6. echo.

  7. :: 遍历所有子文件夹中的视频文件
  8. for /r %%A in (*.mp4 *.mkv *.avi *.mov *.flv *.wmv) do (
  9.     rem 获取文件路径
  10.     set "file=%%A"

  11.     rem 使用 ffprobe 获取视频时长(秒)
  12.     for /f "tokens=* usebackq" %%B in (`ffprobe -v error -select_streams v:0 -show_entries format^=duration -of default^=noprint_wrappers^=1:nokey^=1 "%%A"`) do (
  13.         set "duration=%%B"
  14.     )

  15.     rem 有些文件会出错返回空值,跳过
  16.     if not defined duration (
  17.         echo [跳过] %%~nxA(无法读取时长)
  18.     ) else (
  19.         rem 截取整数部分比较
  20.         set /a dur_int=!duration:.=!
  21.         for /f "tokens=1 delims=." %%C in ("!duration!") do set /a dur_int=%%C

  22.         if !dur_int! lss %LIMIT% (
  23.             echo [删除] %%~nxA(!dur_int! 秒)
  24.             del "%%A"
  25.         ) else (
  26.             echo [保留] %%~nxA(!dur_int! 秒)
  27.         )
  28.     )
  29. )

  30. echo.
  31. echo 处理完毕!
  32. pause
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 07:05 , Processed in 0.016624 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表