标题: [文件操作] 批处理统计文件夹内的图片视频,如何统计数量时排除一些文件,统计大小时包括这些文件 [打印本页]
作者: walkercolin 时间: 2024-7-13 21:39 标题: 批处理统计文件夹内的图片视频,如何统计数量时排除一些文件,统计大小时包括这些文件
- @echo off
- setlocal enabledelayedexpansion
- for /d %%a in (*) do (
- set/a p=v=z=0
- pushd "%%a"
- for %%b in (*.jpg *.png *.bmp) do (
- if not "%%~nb"=="000" if not "%%~nb"=="00.1" if not "%%~nb"=="00.2" if not "%%~nb"=="00.3" (
- set/a p+=1,z+=%%~zb
- )
- )
- for %%c in (*.mp4 *.avi *.mov *.mkv) do (
- set/a v+=1,z+=%%~zc
- )
- set/a "z>>=20"
- popd
- ren "%%a" "%%a [!p!P!v!V-!z!M]"
- )
- pause
复制代码
在这段代码中,脚本会统计当前文件夹下每一个子文件夹中的图像和视频的数量以及总大小,并将结果写在文件夹名称的后面,这之中有段代码表示在统计过程中排除名称为000,00.1,00.2,00.3的文件,这符合我的需求,但是我只是希望在统计图像数量时排除这些文件,统计图像和视频总大小时包括这些文件,而这段代码并不符合我的需求,我不懂代码,我试图用chatgpt修改这段代码,但是不知道是我的叙述有问题还是怎么,chatgpt并不能修改出符合我需求的代码,拜托大家了
作者: ppll2030 时间: 2024-7-13 22:27
本帖最后由 ppll2030 于 2024-7-13 22:29 编辑
回复 [url=http:bbs.bathome.net/redirect.php?goto=findpost&pid=282247&ptid=69363]1#[/url] walkercolin
把计算图片大小从条件里单提出来,就是完全计算。- @echo off
- setlocal enabledelayedexpansion
- for /d %%a in (*) do (
- set/a p=v=z=0
- pushd "%%a"
- for %%b in (*.jpg *.png *.bmp) do (
- rem 计算放在这里,就是对所有图片大小的计算
- set/a z+=%%~zb
- if not "%%~nb"=="000" if not "%%~nb"=="00.1" if not "%%~nb"=="00.2" if not "%%~nb"=="00.3" (
- set/a p+=1
- )
- )
- for %%c in (*.mp4 *.avi *.mov *.mkv) do (
- set/a v+=1,z+=%%~zc
- )
- set/a "z>>=20"
- popd
- ren "%%a" "%%a [!p!P!v!V-!z!M]"
- )
- pause
复制代码
作者: walkercolin 时间: 2024-7-13 23:57
回复 2# ppll2030
太感谢了,有用的
作者: 77七 时间: 2024-7-14 16:09
- @echo off
- rem 保存为ansi编码
- cd /d "%~dp0"
- for %%a in ("000" "00.1" "00.2" "00.3") do (
- set _"%%~a"=1
- )
- for /f "delims=" %%d in ('dir /b /ad') do (
- set /a p=v=z=0
- pushd "%%d"
- for /f "delims=" %%i in ('2^>nul dir /b /a-d *.jpg *.png *.bmp') do (
- if not defined _"%%~ni" (
- set /a p+=1
- )
- )
- for /f %%i in ('2^>nul dir /b /a-d *.mp4 *.avi *.mov *.mkv ^|find /c /v ""') do (
- set v=%%i
- )
- for /f "tokens=3" %%i in ('2^>nul dir /-c /a-d *.jpg *.png *.bmp *.mp4 *.avi *.mov *.mkv ^|findstr /iec:" 字节"') do (
- for /f "delims=." %%a in ('powershell -c "%%i/1024/1024"') do (
- set z=%%a
- )
- )
- popd
- call ren "%%d" "%%d %%p%%p %%v%%v %%z%%m"
- )
- pause
复制代码
作者: aloha20200628 时间: 2024-7-14 16:36
本帖最后由 aloha20200628 于 2024-7-14 19:02 编辑
回复 1# walkercolin
当文件尺寸(字节单位)z 值(或其总和)超过批处整数上限2147483647(2GB) 后,set/a z+=%%~zF 就会出错。
楼主的实况若越过此红线,可改用以下代码,其中文件尺寸的累加是调用powershell功能完成,亦可从本坛第三方下载gawk.exe替换powershell完成,其速度明显快于前者(须抹去代码第11行头 REM 关键词,再删除代码第10行即可)... 利用临时文件z.tmp是为提高整体效率,当文件数量较多时其效果明显...
- @echo off &set "zF=%cd%\z.tmp" &setlocal enabledelayedexpansion
- for /d %%a in (*) do (
- set/a "p=v=z=0"
- pushd "%%a"
- ( for %%b in (*.jpg *.png *.bmp) do (
- echo,%%~zb
- if not "%%~nb"=="000" if not "%%~nb"=="00.1" if not "%%~nb"=="00.2" if not "%%~nb"=="00.3" set/a p+=1)
- for %%c in (*.mp4 *.avi *.mov *.mkv) do (set/a "v+=1"&echo,%%~zc)
- )>"%zF%"
- for /f %%z in (' powershell "$z=0;gc '%zF%'|foreach{$z+=$_};[math]::round($z/1mb)" ') do set "z=%%z"
- REM for /f %%z in (' gawk "{z+=$1;print int(z/1024/1024)}" "%zF%" ') do set "z=%%z"
- popd
- ren "%%a" "%%a [!p!P!v!V-!z!M]"
- )
- del/q "%zF%"&endlocal&pause&exit/b
复制代码
作者: aloha20200628 时间: 2024-7-14 17:12
本帖最后由 aloha20200628 于 2024-7-14 17:23 编辑
回复 1# walkercolin
再给一个不用for循环反复遍历目录文件的版本...
尽量采用 find.exe 一次性过滤出目标数据,再用powershell或gawk完成文件尺寸累加(以防数据超限)
备注》亦可从本坛第三方下载gawk.exe,替换powershell方法(须抹去代码第12行头 REM 关键词,再删除代码第11行即可)
- @echo off &setlocal enabledelayedexpansion
- set "pF=*.jpg *.png *.bmp"
- set "vF=*.mp4 *.avi *.mov *.mkv"
- 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")
- for /d %%d in (*) do (
- set/a "n=p=v=z=0" &pushd "%%d"
- for /f %%n in (' dir /b/a-d !s!^|find /c /v "" ') do set "n=%%n"
- for /f %%p in (' dir /b/a-d !pF!^|find /c /v "" ') do set/a "p=%%p-n"
- for /f "tokens=1-3 delims= " %%a in (
- ' dir /-c !pF! !vF!^| find /i "个文件" ') do (set/a "v=%%a-p-n"&set "z=%%c")
- for /f %%z in (' powershell -c "[math]::round(!z!/1mb)" ') do set "z=%%z"
- REM for /f %%z in (' gawk "BEGIN{print(int(!z!/1024/1024))}" ') do set "z=%%z"
- popd &ren "%%d" "%%d [!p!P!v!V-!z!M]"
- )
- endlocal&pause&exit/b
复制代码
作者: 77七 时间: 2024-7-14 17:43
回复 5# aloha20200628
大佬,这个z.tmp没注意路径吧
作者: aloha20200628 时间: 2024-7-14 19:01
回复 7# 77七
谢谢提醒 代码已订正...
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |