返回列表 发帖
本帖最后由 walkercolin 于 2024-8-26 20:37 编辑

回复 13# ppll2030

大佬,很不好意思现在打扰你,按照您的意思修改完代码之后,一开始用的并没有什么问题,但是后面仔细检查时发现计算大小很多时候总是会差个几mb,和资源管理器所显示的大小并不一致,不知道这是为什么
@echo off
setlocal enabledelayedexpansion
for /d %%a in (*) do (
    set/a p=v=z=0
    pushd "%%a"
    for %%b in (*.jpg *.png *.bmp *.jpeg *.gif) 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
    )
    for /f %%v in ('powershell "[math]::Round(!z! / (1073*1000), 0)"') do set "sizeMB=%%v"
    set "sizeUnit=M"
    if !sizeMB! geq 1024 (
        for /f %%v in ('powershell "[math]::Round(!z! / (1073*1000*1000), 2)"') do set "sizeGB=%%v"
        set "sizeUnit=G"
    )
    popd
    if !v! equ 0 (
        rem 没有视频,只有图像
        if "!sizeUnit!"=="G" (
            ren "%%a" "%%a [!p!P-!sizeGB!!sizeUnit!]"
        ) else (
            ren "%%a" "%%a [!p!P-!sizeMB!!sizeUnit!]"
        )
    ) else if !p! equ 0 (
        rem 没有图像,只有视频
        if "!sizeUnit!"=="G" (
            ren "%%a" "%%a [!v!V-!sizeGB!!sizeUnit!]"
        ) else (
            ren "%%a" "%%a [!v!V-!sizeMB!!sizeUnit!]"
        )
    ) else (
        rem 既有图像又有视频
        if "!sizeUnit!"=="G" (
            ren "%%a" "%%a [!p!P!v!V-!sizeGB!!sizeUnit!]"
        ) else (
            ren "%%a" "%%a [!p!P!v!V-!sizeMB!!sizeUnit!]"
        )
    )
)
pauseCOPY

TOP

回复 16# walkercolin


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

或者用上面大佬的进率。第一个该为1mb,第二个改为1tb 这个比较直观。

TOP

回复 17# ppll2030
谢谢大佬,现在计算倒是正常的,只不过他会四舍五入158.8他就能继承159mb,当然也不是什么问题,现在的问题是超过2G的内容这玩意儿就有点毛病了,一个2.24g的内容它记成了1796M,一个2.38g的内容记成了1654M,暂不理解为什么

TOP

本帖最后由 77七 于 2024-8-28 13:32 编辑

回复 18# walkercolin


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

@echo off
rem 保存为ansi编码
cd /d "%~dp0"
rem 排除特定文件(000,00.1,00.2,00.3),不需要可以删除下一行
set "_f=^|findstr /rvix /c:"00\.[123]\.[jpb][pnm][gp]" /c:"000\.[jpb][pnm][gp]""
(for /f "delims=" %%d in ('dir /b /ad') do (
setlocal
pushd "%%d"
if not errorlevel 1 (
for /f %%a in ('dir /b /a-d *.jpg *.png *.bmp %_f% ^|find /c /v ""') do (
set /a "1/%%a" && set P=%%aP
)
for /f %%a in ('dir /b /a-d *.mp4 *.avi *.mov *.mkv ^|find /c /v ""') do (
set /a "1/%%a" && set V=%%aV
)
set m=1048576
for /f "eol=0tokens=3" %%j in ('dir /s /a-d /-c *.jpg *.png *.bmp *.mp4 *.avi *.mov *.mkv 2^>nul^| findstr /i "个文件.*字节$"') do (
set size=%%j00
setlocal enabledelayedexpansion
if !size! geq 102400 (
if !size! geq 104857600 (
set s=MB
set t=!size!
set len=!t:~9!9876543210
set /a len=!len:~9,1!+9
set /a "r=!t:~,8!%%m,size=!t:~,8!/m"
set /a len-=1
for /l %%j in (8 1 !len!) do (
set/a "q=!r!!t:~%%j,1!/m,r=!r!!t:~%%j,1!%%m"
set "size=!size!!q!"
)
if !size! geq 102400 set s=GB&set /asize/=1024
) else set s=KB&set /asize/=1024
) else set s=Byte
for /f "tokens=1-3" %%a in ("!size:~,-2! !size:~-2! !s!") do (
endlocal
set Z=%%a.%%b%%c
)
)
popd
if defined Z (
call echo ren "%%d" "%%d [%%p%%%%V%%-%%Z%%]"
)
)
endlocal
)) 2>nul
pauseCOPY
1

评分人数

bat小白,请多指教!谢谢!

TOP

回复 18# walkercolin


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

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

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

评分人数

TOP

回复 20# ppll2030

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

TOP

返回列表