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

[文本处理] [已解决]批处理怎么获取目录下文件大小少于5M的文件夹列表?

目录下有N个文件夹,希望扫描目录下文件,把包含文件大小少于5M的文件夹名生成一个txt
文件大小是指所有文件加起来小于5M,不是单一文件。
把文件夹名列出来,不是文件。
大神该怎么写??

本帖最后由 smss 于 2020-5-28 01:07 编辑
  1. @echo off&setlocal enabledelayedexpansion&set m=1048576
  2. (for /f "tokens=*" %%i in ('dir /ad /b') do (set size=000
  3. for /f "eol=0tokens=3" %%j in ('dir /s/a/-c "%%i" 2^>nul^| findstr /i "个文件.*字节$"') do set "size=%%j00"
  4. if !size! geq 102400 (if !size! geq 104857600 (set s=MB&set t=!size!&set len=!t:~9!98765432100&set /alen=9+!len:~10,1!&set/a "r=!t:~,8!%%m,size=!t:~,8!/m"
  5. 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!"
  6. if !size! geq 102400 set s=GB&set /asize/=1024)else set s=KB&set /asize/=1024)else set s=Byte
  7. if "!size!" GTR "5" echo %%i !size:~,-2!.!size:~-2! !s!))>结果.TXT&start "" 结果.TXT&pause
复制代码
参考http://www.bathome.net/thread-31593-1-1.html    http://bbs.bathome.net/viewthread.php?tid=25682

TOP

本帖最后由 went 于 2020-5-28 11:29 编辑

for /r /d 参数的作用来了
dir是主文件夹,max是最大字节数
如果要递归处理子文件夹,使用第5行,把第6行REM起来
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set "dir=D:\Notepad++"
  4. set "max=5242880"
  5. REM for /r "%dir%" /d %%i in ("*") do call :getFolderSize "%%i"
  6. for /d %%i in ("%dir%\*") do call :getFolderSize "%%i"
  7. pause&exit
  8. :getFolderSize
  9. set "size=0"
  10. for /r "%~1" %%i in ("*") do ( set /a "size+=%%~zi" & if !size! gtr %max% goto :eof )
  11. if !size! leq 1024 ( echo !size!B %~1 & goto :eof )
  12. if !size! leq 1048576 ( set /a "size/=1024" & echo !size!KB %~1 & goto :eof )
  13. set /a "size=!size!/1024/1024" & echo !size!MB %~1 & goto :eof )
复制代码

TOP

回复 3# went

老哥,能不能改成是bat放在哪个目录下就自动扫描当前目录的文件夹,并且把文件夹列表生成一个txt文件呢?

TOP

回复 4# itunesis
set "dir=%~dp0"即可
生成dirList.txt,两位小数
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set "dir=%~dp0"
  4. set "max=5242880"
  5. (
  6. REM for /r "%dir%" /d %%i in ("*") do call :getFolderSize "%%i"
  7. for /d %%i in ("%dir%*") do call :getFolderSize "%%i"
  8. )>"%~dp0dirList.txt"
  9. type "%~dp0dirList.txt"
  10. echo ----------------------
  11. echo out file: %~dp0dirList.txt
  12. echo ----------------------
  13. pause&exit
  14. :getFolderSize
  15. set "size=0"
  16. for /r "%~1" %%i in ("*") do ( set /a "size+=%%~zi" & if !size! gtr %max% goto :eof )
  17. if !size! leq 1024 ( set "unit=B" & goto :show )
  18. if !size! leq 1048576 ( set "unit=KB" & set /a "size=!size!*100/1024" & set "size=!size:~0,-2!.!size:~-2!" & goto :show )
  19. set "unit=MB" & set /a "size=!size!*100/1024/1024" & set "size=!size:~0,-2!.!size:~-2!"
  20. :show
  21. set "size=%size%%unit%          "
  22. echo %size:~0,10% %~1
复制代码

TOP

回复 5# went


不好意思老哥,就是还有一个小小的问题。
那个输出的txt文件里面的列表能不能只显示文件夹名,文件大小和路径都不要显示。
就是只把文件夹名列出来就可以了。
不好意思老哥,麻烦你这么多次。

TOP

看你意思是不用处理子文件夹
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set "dir=%~dp0"
  4. set "max=5242880"
  5. ( for /d %%i in ("%dir%\*") do call :getFolderSize "%%i" )>"%~dp0dirList.txt"
  6. type "%~dp0dirList.txt"
  7. echo ----------------------
  8. echo out file: %~dp0dirList.txt
  9. echo ----------------------
  10. pause&exit
  11. :getFolderSize
  12. set "size=0"
  13. for /r "%~1" %%i in ("*") do ( set /a "size+=%%~zi" & if !size! gtr %max% goto :eof )
  14. echo %~nx1
复制代码

TOP

回复 7# went


    非常感谢,完美!

TOP

返回列表