[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
本帖最后由 aloha20200628 于 2024-1-29 20:10 编辑

回复 25# qd2024

看楼主用数学题轮训各位热心解答者,也跟一帖。
代码说明:
一。获取dir简报结果至少须用 "delims=" 禁止系统分隔符(,; =),须用 /s 获取全路径文件名
二。用双引号包裹命令表达式,减少打理转义符的麻烦
三。ffprobe筛选时长的参数表达式虽然很多,但其输出效率之差可忽略,选择最轻量化代码即可
四。本帖要求时长误差是分钟级,故可免去调用外部浮点运算功能

以下代码可存为test.bat,将一级目录拖给它即可,完成一级目录及其子目录的更名》源目录名【时长】。
  1. @echo off
  2. if "%~1"=="" (exit/b) else (setlocal enabledelayedexpansion)
  3. set fpb="C:\ffmpeg\bin\ffprobe.exe"
  4. for /f "delims=" %%D in (' dir /b/s/ad "%~1" ') do (
  5. for /f "delims=" %%F in (' dir /b/s/a-d "%%~D\*.mp4" ') do (
  6. for /f "tokens=1-4 delims=:. " %%1 in (' "%fpb% "%%~F" 2>&1 | findstr /ic:"Duration:" " ') do (
  7. set/a "m+=%%2*60+%%3,s+=%%4">nul 2>nul
  8. )
  9. )
  10. set/a "ms=s/60,sm=s%%60,m+=ms">nul 2>nul
  11. if !sm! neq 0 (set/a m+=1)
  12. ren "%%~D" "%%~nxD【!m!】" & set/a "mm+=m,m=s=0"
  13. )
  14. ren "%~1" "%~nx1【!mm!】"
  15. endlocal&exit/b
复制代码

TOP


给一个不调用ffprobe.exe的bat+jscript混编版本,直接调用windows系统内置的fso功能获取媒体文件属性(如时长),与用ffprobe.exe/mediainfo.exe等外部方法对比可明显提速(尤其是大目录操作),因批处理脚本调用后者是逐个文件处理,而前者能一次性批量处理。
以下代码可存为test.bat,将一级目录拖给它即可,完成一级目录及其子目录的更名》源目录名【时长】。
  1. @set @v=1 /*
  2. @echo off
  3. if "%~1"=="" (exit/b) else (setlocal enabledelayedexpansion)
  4. (for /f "delims=" %%D in (' dir /b/s/ad "%~1" ') do (
  5. for /f %%v in (' " dir/b/s/a-d "%%~D\*.mp4"|cscript /e:jscript "%~f0" " ') do (set "m=%%v")
  6. set/a "mm+=!m!" & ren "%%~D" "%%~nxD【!m!】"
  7. )
  8. ren "%~1" "%~nx1【!mm!】" & endlocal & exit/b) 2>nul
  9. */
  10. m = s = ms = sm = 0, ws = WSH.stdin, sa = WSH.createobject('shell.application');
  11. while (!ws.atendofstream) {
  12. F = ws.readline(); i = F.lastIndexOf('\\'), pF = F.substr(0,i+1), nF = F.substr(i+1);
  13. ns = sa.namespace(pF), pn = ns.parsename(nF); d = ns.getdetailsof(pn,27).split(':');
  14. m += ~~d[0]*60 + ~~d[1]; s += ~~d[2];
  15. }
  16. WSH.echo(m+=Math.ceil(s/60));
复制代码

TOP

回复 31# newswan

类同资源管理器各种媒体文件文件属性列表中的时长。可修改29楼代码中的*.mp4(扩展名),验证结果...

TOP

回复 34# qd2024

27楼或29楼代码中的第5行》修改 *.mp4 为 *.mp? 即可包括 mp4/mp3 音视频文件
如果子目录中全是常见类型的音视频文件(mp4/mkv/avi/wmv/vob/ts/mpg/mp3/flac/wav/...),可修改为 *.* 通配符涵盖所有文件。

TOP

返回列表