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

[文件操作] 批处理统计文件夹内的图片视频,计算大小时如何统计单位为G

[复制链接]
 楼主| 发表于 2024-8-26 20:36:05 | 显示全部楼层
本帖最后由 walkercolin 于 2024-8-26 20:37 编辑

回复 13# ppll2030

大佬,很不好意思现在打扰你,按照您的意思修改完代码之后,一开始用的并没有什么问题,但是后面仔细检查时发现计算大小很多时候总是会差个几mb,和资源管理器所显示的大小并不一致,不知道这是为什么
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /d %%a in (*) do (
  4.     set/a p=v=z=0
  5.     pushd "%%a"
  6.     for %%b in (*.jpg *.png *.bmp *.jpeg *.gif) do (
  7.         rem 计算放在这里,就是对所有图片大小的计算
  8.         set/a z+=%%~zb
  9.         if not "%%~nb"=="000" if not "%%~nb"=="00.1" if not "%%~nb"=="00.2" if not "%%~nb"=="00.3" (
  10.             set/a p+=1
  11.         )
  12.     )
  13.     for %%c in (*.mp4 *.avi *.mov *.mkv) do (
  14.         set/a v+=1,z+=%%~zc
  15.     )
  16.     for /f %%v in ('powershell "[math]::Round(!z! / (1073*1000), 0)"') do set "sizeMB=%%v"
  17.     set "sizeUnit=M"
  18.     if !sizeMB! geq 1024 (
  19.         for /f %%v in ('powershell "[math]::Round(!z! / (1073*1000*1000), 2)"') do set "sizeGB=%%v"
  20.         set "sizeUnit=G"
  21.     )
  22.     popd
  23.     if !v! equ 0 (
  24.         rem 没有视频,只有图像
  25.         if "!sizeUnit!"=="G" (
  26.             ren "%%a" "%%a [!p!P-!sizeGB!!sizeUnit!]"
  27.         ) else (
  28.             ren "%%a" "%%a [!p!P-!sizeMB!!sizeUnit!]"
  29.         )
  30.     ) else if !p! equ 0 (
  31.         rem 没有图像,只有视频
  32.         if "!sizeUnit!"=="G" (
  33.             ren "%%a" "%%a [!v!V-!sizeGB!!sizeUnit!]"
  34.         ) else (
  35.             ren "%%a" "%%a [!v!V-!sizeMB!!sizeUnit!]"
  36.         )
  37.     ) else (
  38.         rem 既有图像又有视频
  39.         if "!sizeUnit!"=="G" (
  40.             ren "%%a" "%%a [!p!P!v!V-!sizeGB!!sizeUnit!]"
  41.         ) else (
  42.             ren "%%a" "%%a [!p!P!v!V-!sizeMB!!sizeUnit!]"
  43.         )
  44.     )
  45. )
  46. pause
复制代码
发表于 2024-8-26 21:16:07 | 显示全部楼层
回复 16# walkercolin


    转换进率你可以改一下。
16行的 1073*1000 改为 1024*1024
19行的 1073*1000*1000 改为 1024*1024*1024

或者用上面大佬的进率。第一个该为1mb,第二个改为1tb 这个比较直观。
 楼主| 发表于 2024-8-27 07:23:54 | 显示全部楼层
回复 17# ppll2030
谢谢大佬,现在计算倒是正常的,只不过他会四舍五入158.8他就能继承159mb,当然也不是什么问题,现在的问题是超过2G的内容这玩意儿就有点毛病了,一个2.24g的内容它记成了1796M,一个2.38g的内容记成了1654M,暂不理解为什么
发表于 2024-8-27 12:10:15 | 显示全部楼层
本帖最后由 77七 于 2024-8-28 13:32 编辑

回复 18# walkercolin


代码中的计算方式是terse大佬的代码,我数学不好,认真看,还是存在数学问题上的鸿沟,即使数学老师在,我估计也要学习很久,所以不想了,只是从for /l 字符串截取不为空的前提下,改动了一下 计算长度,和 for /l 中的结尾数字,不一定对,请多包涵。

  1. @echo off
  2. rem 保存为ansi编码
  3. cd /d "%~dp0"
  4. rem 排除特定文件(000,00.1,00.2,00.3),不需要可以删除下一行
  5. set "_f=^|findstr /rvix /c:"00\.[123]\.[jpb][pnm][gp]" /c:"000\.[jpb][pnm][gp]""

  6. (for /f "delims=" %%d in ('dir /b /ad') do (
  7.         setlocal
  8.         pushd "%%d"
  9.         if not errorlevel 1 (
  10.                 for /f %%a in ('dir /b /a-d *.jpg *.png *.bmp %_f% ^|find /c /v ""') do (
  11.                         set /a "1/%%a" && set P=%%aP
  12.                 )
  13.                 for /f %%a in ('dir /b /a-d *.mp4 *.avi *.mov *.mkv ^|find /c /v ""') do (
  14.                         set /a "1/%%a" && set V=%%aV
  15.                 )
  16.                 set m=1048576
  17.                 for /f "eol=0tokens=3" %%j in ('dir /s /a-d /-c *.jpg *.png *.bmp *.mp4 *.avi *.mov *.mkv 2^>nul^| findstr /i "个文件.*字节$"') do (
  18.                         set size=%%j00
  19.                         setlocal enabledelayedexpansion
  20.                         if !size! geq 102400 (
  21.                                 if !size! geq 104857600 (
  22.                                         set s=MB
  23.                                         set t=!size!
  24.                                         set len=!t:~9!9876543210
  25.                                         set /a len=!len:~9,1!+9
  26.                                         set /a "r=!t:~,8!%%m,size=!t:~,8!/m"
  27.                                         set /a len-=1
  28.                                         for /l %%j in (8 1 !len!) do (
  29.                                                 set/a "q=!r!!t:~%%j,1!/m,r=!r!!t:~%%j,1!%%m"
  30.                                                 set "size=!size!!q!"
  31.                                         )
  32.                                         if !size! geq 102400 set s=GB&set /asize/=1024
  33.                                 ) else set s=KB&set /asize/=1024
  34.                         ) else set s=Byte
  35.                         for /f "tokens=1-3" %%a in ("!size:~,-2! !size:~-2! !s!") do (
  36.                                 endlocal
  37.                                 set Z=%%a.%%b%%c
  38.                         )
  39.                 )
  40.                 popd
  41.                 if defined Z (
  42.                         call echo ren "%%d" "%%d [%%p%%%%V%%-%%Z%%]"
  43.                 )
  44.         )
  45.         endlocal
  46. )) 2>nul
  47. pause
复制代码

评分

参与人数 1技术 +1 收起 理由
walkercolin + 1 感谢分享

查看全部评分

发表于 2024-8-27 13:52:22 | 显示全部楼层
回复 18# walkercolin


    终于看到你提出这个问题了。多次提醒你2G的限制,我就纳闷了。这么久了你都没碰到过这个问题

赶紧更换代码,楼上很多大佬都有给出了的。

多种情况更名,你喜欢的也可以保留自己的那部分,改一改变量,衔接上即可。毕竟是自己的更亲一点吧:lol

评分

参与人数 1技术 +1 收起 理由
walkercolin + 1 感谢分享

查看全部评分

 楼主| 发表于 2024-8-27 14:47:56 | 显示全部楼层
回复 20# ppll2030

实在抱歉,大佬,我想应该是理解上的误差,因为直到现在我才能看懂部分所说的内容,而这里的看懂甚至不是指的看懂代码,一方面是由于我真的什么代码都看不懂所以导致无法正确理解你们在说什么,还有就是大佬认为的我不懂和我认为的我不懂有那么些许差别,实在对不起,在这里万分感谢各位的帮助,谢谢了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-3-17 19:45 , Processed in 0.019335 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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