| 
 
iaide007 
初级用户
 
  
 
  
 
积分 36 
发帖 12 
注册 2006-9-8 
状态 离线
 | 
『楼 主』:
 求助~!
 
使用 LLM 解释/回答一下
  
如何判断一个文件夹大于500M 就清空? 
 
 
什么写。请高手赐招。:P 
 
    
 
  
  |  
                  
  
                     QQ群名称:◥◣批处理时代◢◤  
QQ群号码:6702314 |   
 | 
  2006-9-9 10:07 | 
  
 | 
 | 
 
NaturalJ0 
银牌会员
 
     
 
  
 
积分 1181 
发帖 533 
注册 2006-8-14 
状态 离线
 | 
『第 2 楼』:
 
 
使用 LLM 解释/回答一下
  
dir/a/s 应该能查出总量,比如这样的。 
 
     所列文件总数: 
            4883 个文件  1,155,276,674 字节 
             746 个目录  3,041,497,088 可用字节 
 
有数量后应该可以做了吧。 
 
    
 
  
 |   
 | 
  2006-9-10 00:02 | 
  
 | 
 | 
 
namejm 
荣誉版主
 
        batch fan
  
 
积分 5226 
发帖 1737 
注册 2006-3-10 来自 成都 
状态 离线
 | 
     『第 3 楼』:
 
 
使用 LLM 解释/回答一下
  
  NaturalJ0提到了思路,那我就来一段代码吧。 
  要注意的是,因为CMD进行运算有取值范围的限制,所以对取到的字节数的最后三位作了抛弃处理,得到的结果是个近似值,一般是取到的字节数越大,误差越小,500M左右的文件夹,其误差可以忽略不计:
  
@echo off 
set size=0 
setlocal enabledelayedexpansion 
for /f "tokens=3" %%i in ('dir /a /s /-c "文件夹"^|findstr "个文件"') do ( 
    set size_=%%i 
    set /a size=!size_!+!size! 
) 
set /a size=%size%/2 
set /a size=%size:~0,-3%/1049 
if %size% gtr 500 rd "文件夹" && md "文件夹" 
 
 Last edited by namejm on 2006-9-10 at 01:59 ]  
 
    
 
 
 
  
  |  
                  
  
                    尺有所短,寸有所长,学好CMD没商量。 
考虑问题复杂化,解决问题简洁化。 |   
 | 
  2006-9-10 01:57 | 
  
 | 
 | 
 
3742668 
荣誉版主
 
       
 
  
  
积分 2013 
发帖 718 
注册 2006-2-18 
状态 离线
 | 
『第 4 楼』:
 
 
使用 LLM 解释/回答一下
  
Re namejm: 
    个人认为不必把size单位转换为MB,直接把500MB转换为字节比较似乎可以简略点,因为用if … GTR … 结构不存在set /a的限制。 
 
另: 
    我们几个版主失职,亏得有你们这么多热心朋友支持这个版块,没啥说的,个人给你加上个20分表示感谢。 
 
    
 
  
 |   
 | 
  2006-9-10 23:19 | 
  
 | 
 | 
 
namejm 
荣誉版主
 
        batch fan
  
 
积分 5226 
发帖 1737 
注册 2006-3-10 来自 成都 
状态 离线
 | 
『第 5 楼』:
 
 
使用 LLM 解释/回答一下
  
Re 3742668: 
  首先对你给我加20分表示感谢。
 
  从回复这么多帖子的过程中,我不仅练了手脚,也学到了很多东西。能用批处理帮别人解决一些工作上的问题,让我感到很高兴。我感觉这是一个 回帖→解决别人问题→提高自己写代码的水平→回更具有挑战性的帖→用更简洁更多样化的方法解决别人的问题→……这样一个不断提高的过程,我想很多人都会乐在其中的。
 
  看到你说可以不用转换为MB, 因为用if … GTR … 结构不存在set /a的限制这句话,我感觉这样处理对以后写代码非常具有实用价值。为了稳妥起见,我测试了一些数据,却在无意中发现CMD在进行数据的比较的时候,还是会受到字节长短的限制,似乎数字位数超过10就会出错。比如在下的两段代码中,执行第一段会显示yes,执行第二段会显示no。 
  1、 if 1234567898 gtr 1234567897 (echo yes) else (echo no)
 
  2、 if 12345678998 gtr 12345678997 (echo yes) else (echo no)
  
 
    
 
  
  |  
                  
  
                    尺有所短,寸有所长,学好CMD没商量。 
考虑问题复杂化,解决问题简洁化。 |   
 | 
  2006-9-11 06:18 | 
  
 | 
 | 
 
zh159 
金牌会员
 
      
 
  
 
积分 3687 
发帖 1467 
注册 2005-8-8 
状态 离线
 | 
『第 6 楼』:
 
 
使用 LLM 解释/回答一下
  
修改一下namejm的: 
@echo off 
for /f "tokens=3" %%i in ('dir /a /s /-c "文件夹"^|findstr "个文件"') do set size=%%i 
set /a size=%size%/1048576 
if %size% gtr 500 rd "文件夹" && md "文件夹" 
set size=%%i
只取“dir /s”最后所列文件总数的总字节  
 
    
 
  
 |   
 | 
  2006-9-11 06:51 | 
  
 | 
 | 
 
namejm 
荣誉版主
 
        batch fan
  
 
积分 5226 
发帖 1737 
注册 2006-3-10 来自 成都 
状态 离线
 | 
『第 7 楼』:
 
 
使用 LLM 解释/回答一下
  
  嘿嘿,zxcv的代码充分利用了for的特性,应该是最简洁的了。 
 
  只是字节数换算成MB的时候,不能直接除以1048576,这个地方应该引起重视,因为如果字节数太大的话,很可能就超出了CMD处理的范围。 
 
    
 
  
  |  
                  
  
                    尺有所短,寸有所长,学好CMD没商量。 
考虑问题复杂化,解决问题简洁化。 |   
 | 
  2006-9-11 07:29 | 
  
 | 
 | 
 
zh159 
金牌会员
 
      
 
  
 
积分 3687 
发帖 1467 
注册 2005-8-8 
状态 离线
 | 
『第 8 楼』:
 
 
使用 LLM 解释/回答一下
  
嘿嘿,我试了2095748268字节(1998M)都没问题,所以才确定这样处理  
补充: 
测试出“set /a size=”数字变量计算最大为  2147483647(2048M)(2的31次方-1) 
“set /a size=”的除数  /n 最大也为  2147483647(2048M)(2的31次方-1)
 
以上XP SP1通过
 
 Last edited by zxcv on 2006-9-11 at 11:26 ]  
 
    
 
  
 |   
 | 
  2006-9-11 08:37 | 
  
 | 
 | 
 
namejm 
荣誉版主
 
        batch fan
  
 
积分 5226 
发帖 1737 
注册 2006-3-10 来自 成都 
状态 离线
 | 
『第 9 楼』:
 
 
使用 LLM 解释/回答一下
  
  呵呵,1998M没问题,并不代表都没问题啊,你看看我在5楼的测试就知道了。 
  其实, set使用双字节存储整数,有32位的存贮范围限制(引willsort语),如果数字不在 2^-31~2^31-1这个范围,CMD就不能正确地对它进行运算了。
 
  类似的帖子有: 如何显示磁盘的剩余空间? 
 
    
 
  
  |  
                  
  
                    尺有所短,寸有所长,学好CMD没商量。 
考虑问题复杂化,解决问题简洁化。 |   
 | 
  2006-9-11 08:59 | 
  
 | 
 | 
 
zh159 
金牌会员
 
      
 
  
 
积分 3687 
发帖 1467 
注册 2005-8-8 
状态 离线
 | 
『第 10 楼』:
 
 
使用 LLM 解释/回答一下
  
确实如此 
 
不过对于楼主,估计基本够用了 
 
不行的将“set /a size=%size%/1048576”改为“set /a size=%size:~0,-3%/1049”就行了 
 
更正一下: 
“set size=”应该不受限,“set /a size=”受2^32-1限制,2^31~2^32-1之间得出“set /a size=%size%”为%size%-4294967296的负数 
 
 Last edited by zxcv on 2006-9-11 at 11:28 ] 
 
    
 
  
 |   
 | 
  2006-9-11 09:05 | 
  
 | 
 | 
 
namejm 
荣誉版主
 
        batch fan
  
 
积分 5226 
发帖 1737 
注册 2006-3-10 来自 成都 
状态 离线
 | 
『第 11 楼』:
 
 
使用 LLM 解释/回答一下
  
Originally posted by zxcv at 2006-9-11 09:05: 
而且如果大于2^32-1,“set size=”也是无效的,也就不能进行“set /a size=”计算  
  所以要对后三位数字作抛弃处理。
 
  现在我发现我那段代码也有问题,除2之前就应该对数字做处理的。还是用你的代码比较好一点,不过要直接抛弃后三位。
 
 Last edited by namejm on 2006-9-12 at 00:29 ]  
 
    
 
  
  |  
                  
  
                    尺有所短,寸有所长,学好CMD没商量。 
考虑问题复杂化,解决问题简洁化。 |   
 | 
  2006-9-11 09:35 | 
  
 | 
 | 
 
piziliu2004 
中级用户
 
    过度热情
  
 
积分 321 
发帖 139 
注册 2006-3-21 
状态 离线
 | 
『第 12 楼』:
 
 
使用 LLM 解释/回答一下
  
刚做了个vbs的给大家分享......... 
 
 
Function ShowFolderSize(filespec) 
   Dim fso, f, s 
   Set fso = CreateObject("Scripting.FileSystemObject") 
   Set f = fso.GetFolder(filespec) 
   s = UCase(f.Name) &" uses " & FormatNumber(f.size/(1024*1024),2) & " MB." 
wscript.echo s 
If FormatNumber(f.size/(1024*1024),2)>=500.00 then 
wscript.echo "the file is over size" 
fso.DeleteFolder(filespec) 
End If 
End Function 
 
    
 
  
  |  
                  
  
                    知识在于不断积累 |   
 | 
  2006-9-13 02:03 | 
  
 |