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

[文件管理] BAT枚举下一级目录大小+排序输出+可递进查询

本帖最后由 523066680 于 2013-8-7 09:08 编辑

    转移磁盘较大文件的时候需要参考一下,就写了。
备注:
    主要是为了一步步找出较大的、影响磁盘空间目录。
调整了一兆以上的数值精确度。

  1. ::Show Each Folder Size with Percent
  2. ::     via 523066680, 2013-08
  3. ::维护记录:
  4. ::1、文件夹名称里存在"%"时被脱逸而导致的错误
  5. ::2、截取的一兆以上的Size进行*1000000/(1024*1024)
  6. ::3、输入open 或者open 编号,打开当前或者对应目录
  7. @echo off
  8. setlocal enabledelayedexpansion
  9. set "back= "
  10. for /l %%a in (1,1,8) do (
  11.     set back=!back!!back!
  12. )
  13. echo 注:以下统计仅为数值截取的大致结果。
  14. :start
  15. echo 当前目录:"%cd%"
  16. for /f "tokens=1" %%a in ('dir /ad ^|find "个目录"') do (
  17.      set all=%%a
  18. )
  19. if "%all%"=="2" (echo 没有子目录,返回上一层 &cd .. &goto :input)
  20. ::关键变量初始化
  21. set /a i=0, Si[0]=0
  22. ::逐个调用
  23. for /f "tokens=*" %%a in ('dir /ad /b') do (
  24.    set TPath=%%a
  25.    call :deal
  26. )
  27. call :ShowDetail
  28. pause
  29. exit
  30. :deal
  31.   set /a i+=1, ia=i-1, ix=i*100/all
  32.   set /p inp=!back!%ix%%% "!TPath!" <nul
  33.   
  34.   for /f "tokens=3" %%a in ('dir /a /-c /s "!TPath!" ^|find " 个文件"') do (
  35.       set bytes=000000000000%%a
  36.       set bytes=!bytes:~-12!
  37.       set MB=%%a
  38.   )
  39.   if "%MB:~6%"=="" (
  40.       set MB=    ^<1
  41.   ) else (
  42.       set /a RealMB=!MB:~0,-6!*1000/1024*1000/1024
  43.       set MB=      !RealMB!
  44.   )
  45.   rem 对齐
  46.   set MB=!MB:~-6!
  47.   
  48.   rem 插入排序
  49.   for /l %%a in (%ia%,-1,0) do (
  50.       set /a A2=%%a+1
  51.       if !bytes! lss !Si[%%a]! (
  52.    set Si[!A2!]=!Si[%%a]!
  53.    set Sj[!A2!]=!Sj[%%a]!
  54.         set Sk[!A2!]=!Sk[%%a]!
  55.       ) else (
  56.    set Si[!A2!]=!bytes!
  57.    set Sj[!A2!]=!TPath!
  58.         set Sk[!A2!]=!MB!
  59.    goto :Out
  60.       )
  61.   )
  62.   :Out
  63.   goto :eof
  64. :ShowDetail
  65.   set /p inp=%back%<nul
  66.   for /l %%a in (1,1,%i%) do (
  67.       echo %%a !Sk[%%a]! MB  !Sj[%%a]!
  68.   )
  69.   echo,
  70.   :input
  71.   set "input="
  72.   set /p input=进入某目录请输入对应编号(exit退出):
  73.   if "%input%"=="exit" (exit)
  74.   if "%input%"=="prev" (cd .. &goto :start)
  75.   if "%input:~0,4%"=="open" (
  76.       if "%input:~4%"=="" (
  77.           start explorer "%cd%"
  78.       ) else (
  79.           if defined Sj[%input:~5%] (
  80.               start explorer "!Sj[%input:~5%]!"
  81.           ) else (
  82.               echo 请输入正确的编号
  83.           )
  84.       )
  85.       goto :input
  86.   )
  87.   if not defined Si[%input%] (
  88.       echo 输入错误
  89.       goto :input
  90.   ) else (
  91.       set next=!Sj[%input%]!
  92.   )
  93.   cd %next%
  94.   goto :start
复制代码

Example

本帖最后由 523066680 于 2013-8-3 23:09 编辑

示例1、安装软件存储目录
22         227 MB  视频编辑和DVD刻录
23         262 MB  网络相关
24         297 MB  系统组件
25         331 MB  磁盘操作和恢复
26         567 MB  驱动
27         823 MB  手机相关
28        1193 MB  Programming
29        2690 MB  编辑软件
进入某目录请输入对应编号(exit退出):29
当前目录:"D:\XSoft\编辑软件"
1            0 MB  Acrobat X11 配置
2            0 MB  GIMP2.8所需的dll
3            0 MB  vim插件
4          793 MB  office2007



示例2、F盘

31        4365 MB  软件备份
32        7372 MB  Program Files
33       10639 MB  virtual
34       19599 MB  x
35       23159 MB  演示

进入某目录请输入对应编号(exit退出):35
当前目录:"F:\演示"
1          429 MB  Samsung
2          849 MB  ASTRA.HD.H.264
3          881 MB  LG
4         1047 MB  philips
5         1911 MB  时间风景纪录片Timescapes.2012.720p.BluRay.x264.AC3-HDChina
6         1981 MB  Panasonic
7         2160 MB  SONY

进入某目录请输入对应编号(exit退出):


遇到System Volume Information 会显示错误,权限的东西就没去折腾了

TOP

再举个栗子

本帖最后由 523066680 于 2013-8-3 23:27 编辑


41          30 MB  .thumbnails
42          38 MB  桌面
43         375 MB  My Documents
44         682 MB  Application Data
45        3660 MB  Local Settings

进入某目录请输入对应编号(exit退出):45
当前目录:"C:\Documents and Settings\am\Local Settings"
1            0 MB  Apps
2            0 MB  TempDIR
3            4 MB  History
4          123 MB  Temporary Internet Files
5          485 MB  Temp
6         3046 MB  Application Data
进入某目录请输入对应编号(exit退出):6
当前目录:"C:\Documents and Settings\am\Local Settings\Application Data"

    省略若干行

41           4 MB  Yodao
42          29 MB  Nokia
43          38 MB  ActiveState
44          46 MB  NewSoft
45          66 MB  Adobe
46         196 MB  Downloaded Installations
47         382 MB  Microsoft
48         583 MB  Mozilla
49        1666 MB  Google

进入某目录请输入对应编号(exit退出):49
当前目录:"C:\Documents and Settings\am\Local Settings\Application Data\Goo
gle"
1            0 MB  CrashReports
2            0 MB  GBScreensaver
3            0 MB  Google Calendar Sync
4            0 MB  Google Talk
5            0 MB  Picasa2Albums
6            5 MB  Update
7           42 MB  Picasa2
8         1618 MB  Chrome


相比平常使用的Mozilla ,chrome 竟然占用1.6G

TOP

唉 比赛题就难在那个比较目录文件问题
几十个文件夹还爽了
  测试了 2000多个文件夹  几个小时的比较也没玩完 直接等到没心情
看来只有放弃了 试了变量处理 和临时文件处理
思绪肯定在那里卡住

TOP

本帖最后由 523066680 于 2013-8-7 08:50 编辑

回复 4# terse

俺还没开始做那题。
以前用perl写过类似的,每一个目录的文件列表都存到哈希表里(像vbs字典),然后筛出重复的。
不过当时也写的一般般,有些目录是整个体系都相同,那么实际对比的时候就会出现子目录也相同的情况。
全都列举出来,有点重复了。

还有十几天,本着休闲的心态去做。不要太上心了。毕竟咱还有工作。

TOP

回复 5# 523066680
当然是娱乐心  来这里就是娱乐为主
但我有强迫症的
总算搞到一个可忍受范围 效率还是不满意 在看看

TOP

回复 6# terse


    加了个油。

TOP

本帖最后由 523066680 于 2013-8-10 09:24 编辑

还是那道题,我的大致方案已经定下了。初始只做大致的文件名一致判断,
后面增加一道审核,用dir /w (不显示日期,显示总大小)输出两个目录文件列表的细节,然后fc核对是否一致。
遇到一个奇怪的问题,有时候一致,有时候不一致。后来发现问题出在可用空间大小……

难念的经.mp3
              29 个文件    182,955,882 字节
               2 个目录  5,376,098,304 可用字节

难念的经.mp3
              29 个文件    182,955,882 字节
               2 个目录  5,376,102,400 可用字节



瞎折腾
还有一个折腾是磁盘出了问题,不管怎么判断都得不到正确的结果=_=

TOP

返回列表