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

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

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

批量获取子文件夹下mp4文件的总时长,将时长加入到子文件夹名中,精确到分钟就行。

回复 16# buyiyang


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

TOP

本帖最后由 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,原因不明。
1

评分人数

    • 77七: 感谢分享技术 + 1

TOP

本帖最后由 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));
复制代码

TOP

回复 12# 77七


    OK了,感谢大佬,大佬最帅

TOP

本帖最后由 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
复制代码
1

评分人数

    • 77七: 感谢分享该软件写绝对路径方法,学习了!技术 + 1

TOP

回复 11# gddsssko


   mediainfo 软件版本问题。我用的 网盘下载 https://f.ws59.cn/f/e4k8ccnbdsg
bat小白,请多指教!谢谢!

TOP

本帖最后由 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#

TOP

回复 9# gddsssko


    文件夹、mediainfo软件、批处理文件 全部打包上传到网盘。
bat小白,请多指教!谢谢!

TOP

回复 8# 77七


    还是不行,也不报错。

TOP

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

这样也是异常的。
bat小白,请多指教!谢谢!

TOP

回复 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\新建文件?
复制代码
bat小白,请多指教!谢谢!

TOP

回复 5# gddsssko


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

如果需要上传截图,可以找个图床,例如:
http://bbs.bathome.net/thread-60985-1-1.html
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

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

回复 4# 77七


    没反应,什么都没发生
蹦出黑窗口显示:Press any key to continue . . .之后什么都没有改变,3楼和4楼代码都是如此

TOP

假如视频过长,用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
复制代码
bat小白,请多指教!谢谢!

TOP

返回列表