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

[文件操作] 批处理统计文件夹内的图片视频,如何统计数量时排除一些文件,统计大小时包括这些文件

  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) do (
  7.         if not "%%~nb"=="000" if not "%%~nb"=="00.1" if not "%%~nb"=="00.2" if not "%%~nb"=="00.3" (
  8.             set/a p+=1,z+=%%~zb
  9.         )
  10.     )
  11.     for %%c in (*.mp4 *.avi *.mov *.mkv) do (
  12.         set/a v+=1,z+=%%~zc
  13.     )
  14.     set/a "z>>=20"
  15.     popd
  16.     ren "%%a" "%%a [!p!P!v!V-!z!M]"
  17. )
  18. pause
复制代码
在这段代码中,脚本会统计当前文件夹下每一个子文件夹中的图像和视频的数量以及总大小,并将结果写在文件夹名称的后面,这之中有段代码表示在统计过程中排除名称为000,00.1,00.2,00.3的文件,这符合我的需求,但是我只是希望在统计图像数量时排除这些文件,统计图像和视频总大小时包括这些文件,而这段代码并不符合我的需求,我不懂代码,我试图用chatgpt修改这段代码,但是不知道是我的叙述有问题还是怎么,chatgpt并不能修改出符合我需求的代码,拜托大家了

本帖最后由 ppll2030 于 2024-7-13 22:29 编辑

回复 [url=http:bbs.bathome.net/redirect.php?goto=findpost&pid=282247&ptid=69363]1#[/url] walkercolin


    把计算图片大小从条件里单提出来,就是完全计算。
  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) 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.     set/a "z>>=20"
  17.     popd
  18.     ren "%%a" "%%a [!p!P!v!V-!z!M]"
  19. )
  20. pause
复制代码
1

评分人数

    • walkercolin: 感谢给帖子标题标注[已解决]字样技术 + 1

TOP

回复 2# ppll2030
太感谢了,有用的

TOP

  1. @echo off
  2. rem 保存为ansi编码
  3. cd /d "%~dp0"
  4. for %%a in ("000" "00.1" "00.2" "00.3") do (
  5. set _"%%~a"=1
  6. )
  7. for /f "delims=" %%d in ('dir /b /ad') do (
  8. set /a p=v=z=0
  9. pushd "%%d"
  10. for /f "delims=" %%i in ('2^>nul dir /b /a-d *.jpg *.png *.bmp') do (
  11. if not defined _"%%~ni" (
  12. set /a p+=1
  13. )
  14. )
  15. for /f %%i in ('2^>nul dir /b /a-d *.mp4 *.avi *.mov *.mkv ^|find /c /v ""') do (
  16. set v=%%i
  17. )
  18. for /f "tokens=3" %%i in ('2^>nul dir /-c /a-d *.jpg *.png *.bmp *.mp4 *.avi *.mov *.mkv ^|findstr /iec:" 字节"') do (
  19. for /f "delims=." %%a in ('powershell -c "%%i/1024/1024"') do (
  20. set z=%%a
  21. )
  22. )
  23. popd
  24. call ren "%%d" "%%d %%p%%p %%v%%v %%z%%m"
  25. )
  26. pause
复制代码
bat小白,请多指教!谢谢!

TOP

本帖最后由 aloha20200628 于 2024-7-14 19:02 编辑

回复 1# walkercolin

当文件尺寸(字节单位)z 值(或其总和)超过批处整数上限2147483647(2GB) 后,set/a z+=%%~zF 就会出错。
楼主的实况若越过此红线,可改用以下代码,其中文件尺寸的累加是调用powershell功能完成,亦可从本坛第三方下载gawk.exe替换powershell完成,其速度明显快于前者(须抹去代码第11行头 REM 关键词,再删除代码第10行即可)... 利用临时文件z.tmp是为提高整体效率,当文件数量较多时其效果明显...
  1. @echo off &set "zF=%cd%\z.tmp" &setlocal enabledelayedexpansion
  2. for /d %%a in (*) do (
  3.     set/a "p=v=z=0"
  4.     pushd "%%a"
  5.     ( for %%b in (*.jpg *.png *.bmp) do (
  6.           echo,%%~zb
  7.           if not "%%~nb"=="000" if not "%%~nb"=="00.1" if not "%%~nb"=="00.2" if not "%%~nb"=="00.3" set/a p+=1)
  8.       for %%c in (*.mp4 *.avi *.mov *.mkv) do (set/a "v+=1"&echo,%%~zc)
  9.     )>"%zF%"
  10.     for /f %%z in (' powershell "$z=0;gc '%zF%'|foreach{$z+=$_};[math]::round($z/1mb)" ') do set "z=%%z"
  11.     REM for /f %%z in (' gawk "{z+=$1;print int(z/1024/1024)}" "%zF%" ') do set "z=%%z"
  12.     popd
  13.     ren "%%a" "%%a [!p!P!v!V-!z!M]"
  14. )
  15. del/q "%zF%"&endlocal&pause&exit/b
复制代码

TOP

本帖最后由 aloha20200628 于 2024-7-14 17:23 编辑

回复 1# walkercolin

再给一个不用for循环反复遍历目录文件的版本...
尽量采用 find.exe 一次性过滤出目标数据,再用powershell或gawk完成文件尺寸累加(以防数据超限)
备注》亦可从本坛第三方下载gawk.exe,替换powershell方法(须抹去代码第12行头 REM 关键词,再删除代码第11行即可)
  1. @echo off &setlocal enabledelayedexpansion
  2. set "pF=*.jpg *.png *.bmp"
  3. set "vF=*.mp4 *.avi *.mov *.mkv"
  4. set "s=" &for %%x in (.jpg .png .bmp) do for %%f in (000 00.1 00.2 00.3) do (set "s=!s! %%f%%x")
  5. for /d %%d in (*) do (
  6.     set/a "n=p=v=z=0" &pushd "%%d"
  7.     for /f %%n in (' dir /b/a-d !s!^|find /c /v "" ') do set "n=%%n"
  8.     for /f %%p in (' dir /b/a-d !pF!^|find /c /v "" ') do set/a "p=%%p-n"
  9.     for /f "tokens=1-3 delims= " %%a in (
  10.     ' dir /-c !pF! !vF!^| find /i "个文件" ') do (set/a "v=%%a-p-n"&set "z=%%c")
  11.     for /f %%z in (' powershell -c "[math]::round(!z!/1mb)" ') do set "z=%%z"
  12.     REM for /f %%z in (' gawk "BEGIN{print(int(!z!/1024/1024))}" ') do set "z=%%z"
  13.     popd &ren "%%d" "%%d [!p!P!v!V-!z!M]"
  14. )
  15. endlocal&pause&exit/b
复制代码

TOP

回复 5# aloha20200628


   大佬,这个z.tmp没注意路径吧
bat小白,请多指教!谢谢!

TOP

回复 7# 77七

谢谢提醒 代码已订正...

TOP

返回列表