Board logo

标题: [文本处理] 批处理怎样 在文件夹名称的最后方 加上视频总时长 [打印本页]

作者: gddsssko    时间: 2024-5-16 14:07     标题: 批处理怎样 在文件夹名称的最后方 加上视频总时长

本帖最后由 gddsssko 于 2024-5-16 14:08 编辑

批量获取子文件夹下mp4文件的总时长,将时长加入到子文件夹名中,精确到分钟就行。
作者: gddsssko    时间: 2024-5-16 14:09

用通义前问折腾了好久都不行
作者: 77七    时间: 2024-5-16 15:11

  1. @echo off
  2. rem 批处理保存为utf-8编码格式
  3. chcp 65001 >nul
  4. cd /d "%~dp0"
  5. for /f "delims=" %%d in ('dir /b /ad') do (
  6. for /f "delims=" %%a in ('mediainfo --Output^="Video;%%Duration%% " "%%d\*.mp4"') do (
  7. for %%b in (%%a) do (
  8. set /a n+=%%b
  9. )
  10. )
  11. if defined n (
  12. set /a n/=1000*60
  13. call ren "%%d" "%%d-%%n%%min"
  14. set n=
  15. )
  16. )
  17. pause
复制代码

作者: 77七    时间: 2024-5-16 15:38

假如视频过长,用set /a 不合适了,我粗略算了一下,大概是超过580小时。以下代码使用powershell计算。
  1. @echo off
  2. rem 批处理保存为utf-8编码格式
  3. chcp 65001 >nul
  4. cd /d "%~dp0"
  5. for /f "delims=" %%d in ('dir /b /ad') do (
  6. for /f "delims=" %%a in ('mediainfo --Output^="Video;%%Duration%%+" "%%d\*.mp4"') do (
  7. for /f "delims=." %%x in ('powershell -c "(%%a0)/1000/60"') do (
  8. ren "%%d" "%%d-%%xmin"
  9. )
  10. )
  11. )
  12. pause
复制代码

作者: gddsssko    时间: 2024-5-16 16:45

本帖最后由 gddsssko 于 2024-5-16 16:52 编辑

回复 4# 77七


    没反应,什么都没发生
蹦出黑窗口显示:Press any key to continue . . .之后什么都没有改变,3楼和4楼代码都是如此
作者: Batcher    时间: 2024-5-16 17:21

回复 5# gddsssko


请参考Q-01观察一下哪行代码在报错以及详细的报错信息:
https://mp.weixin.qq.com/s/Koje4FufWxWBs7ioDy_LJA

如果需要上传截图,可以找个图床,例如:
http://bbs.bathome.net/thread-60985-1-1.html
作者: 77七    时间: 2024-5-16 18:13

回复 5# gddsssko


   没效果应该是没找到文件夹或者mp4文件。
  1. @echo off
  2. rem 批处理保存为ansi编码格式
  3. cd /d "%~dp0"
  4. for /f "delims=" %%d in ('dir /b /s /ad ^|sort /r') do (
  5. for /f "delims=" %%a in ('mediainfo --Output^="Video;%%Duration%%+" "%%d\*.mp4"') do (
  6. for /f "delims=." %%x in ('powershell -c "(%%a0)/1000/60"') do (
  7. echo ren "%%d" "%%~nxd-%%xmin"
  8. )
  9. )
  10. )
  11. pause
复制代码


显示内容正确,删除echo 后再执行。



另外我在写代码中发现一个问题,65001代码页下,dir的结果经过sort排序后最后一个汉字会异常。
  1. @echo off
  2. chcp 65001
  3. md "1\新建文件夹"
  4. dir /b /s /ad "1" |sort /r
  5. pause
  6. exit
  7. 显示
  8. D:\1\新建文件?
复制代码

作者: 77七    时间: 2024-5-16 18:18

  1. @echo off
  2. chcp 65001
  3. echo 批处理|sort
  4. pause
复制代码

这样也是异常的。
作者: gddsssko    时间: 2024-5-16 20:25

回复 8# 77七


    还是不行,也不报错。
作者: 77七    时间: 2024-5-16 20:39

回复 9# gddsssko


    文件夹、mediainfo软件、批处理文件 全部打包上传到网盘。
作者: gddsssko    时间: 2024-5-16 21:09

本帖最后由 gddsssko 于 2024-5-16 21:15 编辑

回复 10# 77七


    百度链接:https://pan.baidu.com/s/1cvUUL8j0R_I6uV6mxWGz5w 提取码:9miw
    或者迅雷链接:https://pan.xunlei.com/s/VNy0XPdvfPPo9MtjMU_Sg50dA1?pwd=d65w#
作者: 77七    时间: 2024-5-16 21:43

回复 11# gddsssko


   mediainfo 软件版本问题。我用的 网盘下载 https://f.ws59.cn/f/e4k8ccnbdsg
作者: aloha20200628    时间: 2024-5-16 22:06

本帖最后由 aloha20200628 于 2024-5-16 22:39 编辑

回复 1# gddsssko

试试如下版本存为test.bat运行,楼主可修改 madiaInfo.exe 路径(代码第2行,路径可包含空格),代码只计入小时和分钟,忽略了秒数
假设楼主每个视频子目录中不一定仅有*.mp4,故稳妥起见,用mediaInfo每次处理单个文件的模式...
  1. @echo off &setlocal enabledelayedexpansion
  2. set "mF=c:\applications\MediaInfo.exe"
  3. for /f "delims=" %%d in ('dir /b/s/ad^|sort /r') do (
  4. pushd "%%d"
  5. for /f "delims=" %%F in (' dir /b/a-d "%%d\*.mp4" ') do (
  6. for /f "tokens=1-3 delims=:." %%a in (' call "%mF%" "--output=General;%%Duration/String3%%" "%%F" ') do (
  7. set "h=%%a"&set "m=%%b"&(if "0"=="!h:~,1!" set "h=!h:~1!")&(if "0"=="!m:~,1!" set "m=!m:~1!")
  8. set/a "t+=!h!*60+!m!" 2>nul
  9. )
  10. )
  11. ren "%%d" "%%~nd.{!t!m}"
  12. set "t=" &popd
  13. )
  14. endlocal&pause&exit/b
复制代码

作者: gddsssko    时间: 2024-5-16 22:12

回复 12# 77七


    OK了,感谢大佬,大佬最帅
作者: buyiyang    时间: 2024-5-16 22:19

本帖最后由 buyiyang 于 2024-5-16 22:23 编辑

我之前在相同问题下写过一个,善于搜索
http://www.bathome.net/redirect.php?goto=findpost&pid=278109&ptid=68365
  1. @if(0)==(0) @echo off
  2. cd /d "%~dp0"
  3. for /d %%d in (*) do (
  4.     pushd "%%d"
  5.     for /f "delims=" %%i in ('dir /b /a-d "*.mp4"^|cscript /e:jscript /Nologo "%~f0"') do (
  6.     popd
  7.     ren "%%d" "%%d【%%i分】"
  8.     )
  9. )
  10. pause&exit
  11. @end
  12. objPlayer=new ActiveXObject("WMPlayer.OCX"),ws=WSH.stdin,durationInSeconds=0;
  13. while (!ws.atendofstream) {
  14.     var filePath = ws.readline();
  15.     var objMedia = objPlayer.newMedia(filePath);
  16.     durationInSeconds += objMedia.duration
  17. }
  18. WScript.Echo(Math.ceil(durationInSeconds/60));
复制代码

作者: buyiyang    时间: 2024-5-16 22:54

本帖最后由 buyiyang 于 2024-5-16 22:58 编辑

回复 8# 77七


    这个确实奇怪,我将unicode字符集中的U+4e00~U+9fa6的中文字符集中逐一拿单个字符做了测试,
发现其中一部分能正确显示(集合A),其余的不能正确显示(集合B)。

发现其中有规律,一(U+4E00)、乀(U+4E40)……等可以正确显示,也就是说每隔64个便是A的字符;

B的字符如果是连续奇数个出现则最后一个字符不能正确显示,在实际输出中,如果是2n+1个字符,则该6n+3个字节的最后一个字节会变成0x3f,原因不明。
作者: 77七    时间: 2024-5-16 23:58

回复 16# buyiyang


   谢谢大佬指点!大佬辛苦了!我是程序语言门外汉,既然这个规律复杂,以后我会注意避免在65001下使用sort。




欢迎光临 批处理之家 (http://bathome.net./) Powered by Discuz! 7.2