本帖最后由 WHY 于 2018-3-31 23:36 编辑
2018-3-30 修改:去掉 dir /b /o-d /a-d /s 中的 /s
dir 加上 /o-d 和 /s 参数以后遍历子目录并按日期排序时,分别将各个子目录中的文件排序,不是所有文件排序,这与 PowerShell 不同。
2018-3-31 修改:脚本微调,减少循环次数。
脚本思路:
1.文件大小的值可能很大,超出 cmd 的限制(2^31),不能直接当作被除数来计算
如果直接把 1GB(2^30)当作除数来计算,也可能超出限制
2.在文件大小这个字符串的后面补两个0,扩大100倍
3.假定扩大100倍后文件大小不超过 20 位,事实上不可能超出 20 位,分两步计算:
a.从第 8 位开始到第 20 位,模拟笔算的方式除以 134217728(2^27)
b.结果再直接除以 8(2^3)
4.最终结果取两位小数(缩小100倍)- @echo off
- for /f "delims=" %%i in ('dir /b /o-d /a-d *.rar') do (
- setlocal enabledelayedexpansion
- set "sz=%%~zi00"
- set "Rem=!sz:~0,8!"
- rem Div=被除数; Rem=余数; Quo=商; Ret=结果
- for /L %%j in (8 1 20) do (
- if not "!sz:~%%j!" == "" (
- set "Div=!Rem!!sz:~%%j,1!"
- set /a Rem = Div %% 134217728, Quo = Div / 134217728
- if "!Rem!" == "0" (set "Rem=")
- set "Ret=!Ret!!Quo!"
- )
- )
- set "Ret=000000000!Ret!"
- set /a "Ret = (1!Ret:~-9! - 1000000000) / 8"
- if !Ret! LSS 100 (set "Ret=000!Ret!" & set "Ret=!Ret:~-3!")
- for /f %%j in ("!Ret:~0,-2!.!Ret:~-2!") do (
- endlocal
- for %%k in ("%%~dpi.") do echo;%%~fk %%~nxi %%jGB
- )
- pause & exit /b
- )
复制代码 |