中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 请教各位高手,这样的怎么实现?
« [1] [2] »
作者:
标题: 请教各位高手,这样的怎么实现? 上一主题 | 下一主题
chkau
初级用户





积分 101
发帖 47
注册 2007-4-18
状态 离线
『楼 主』:  请教各位高手,这样的怎么实现?

我现在有D,E两个分区,E盘里有个文件夹,我想在D盘下写一个批处理,运行后自动对比D盘的剩余空间和E盘那个文件夹大小,如果D盘剩余空间大于E盘那个文件夹1G,就自动执行1.BAT,否则就自动删除掉D盘上访问时间最早的1个文件夹,再对比,如果空间还不够就再删1个访问时间最早的文件夹,直到D盘剩余空间大于E盘那个文件夹1G为止,然后自动执行1.BAT
请问各位大大,这个命令怎么写啊?

2007-4-18 16:32
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
chkau
初级用户





积分 101
发帖 47
注册 2007-4-18
状态 离线
『第 2 楼』:  

我语言表达能力不好.....这篇字看的我自己头都晕了,整理一下,是这个意思
我需要从我的E盘复制某文件夹到本地D盘根目录,前提是复制完后D盘剩余空间不小于1GB,如果剩余空间不足无法复制则依次删除D盘下访问时间最早的文件夹,直到能够复制目标文件夹为止...
大概就是这样,不知道批处理如何实现

2007-4-18 16:35
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
chkau
初级用户





积分 101
发帖 47
注册 2007-4-18
状态 离线
『第 3 楼』:  

@echo off
for /f "tokens=2 delims=录可" %%i in ('dir /ad /-c d:\') do @echo %%i >free.txt
for /f "tokens=2 delims=件" %%b in ('dir /ad /-c e:\1') do @echo %%b>1.txt
for /f "tokens=1 delims= " %%a in (1.txt) do @echo %%a >lose.txt
@del 1.txt
这样做了我就分别提取了D盘的剩余空间和E盘的1文件夹的大小,但是接下来怎么把这两个数字进行对比?

2007-4-19 02:03
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
bjsh
银牌会员





积分 2000
发帖 621
注册 2007-1-1
状态 离线
『第 4 楼』:  



[ Last edited by bjsh on 2007-4-18 at 01:50 PM ]

2007-4-19 02:47
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
zhoushijay
高级用户

Autowalk


积分 845
发帖 375
注册 2007-3-3
状态 离线
『第 5 楼』:  

吃好饭再来解决  ^^

2007-4-19 03:15
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
chkau
初级用户





积分 101
发帖 47
注册 2007-4-18
状态 离线
『第 6 楼』:  

发现一个问题,在DOS下dir文件夹只能查看到该文件夹所含文件的总大小,看不到文件夹总大小,有什么方法解决吗?

2007-4-19 03:39
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
bowman
新手上路





积分 16
发帖 6
注册 2007-3-19
状态 离线
『第 7 楼』:  



  Quote:
Originally posted by chkau at 2007-4-18 02:39 PM:
发现一个问题,在DOS下dir文件夹只能查看到该文件夹所含文件的总大小,看不到文件夹总大小,有什么方法解决吗?

dir dirpath /a/s/-c
倒数第2行显示文件夹大小

2007-4-19 06:08
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
zhoushijay
高级用户

Autowalk


积分 845
发帖 375
注册 2007-3-3
状态 离线
『第 8 楼』:  


dim q,fn,frD
Set q = CreateObject("Scripting.FileSystemObject")
set fn=q.getdrive("d:")
frD=fn.freespace/1024/1024/1024
dim fon,size
set fon=q.getfolder("F:\GHOST")
size=fon.size/1024/1024/1024

if frD>size and frD>1 then
   dim ws
   set ws=wscript.createobject("WScript.Shell")
   ws.run "1.bat"


else
    do until frD>size and frD>1
            frD=fn.freespace/1024/1024/1024
            set fon=q.getfolder("F:\GHOST")
            size=fon.size/1024/1024/1024
            set ws=wscript.createobject("WScript.Shell")
            ws.run "cmd /c dir /od /ad /b d:\>folder.txt"
            set file=q.opentextfile("folder.txt")
            fil=file.readline

            q.deletefolder "d:\"&fil,true
    loop
end if
VBS版 呵呵,基本上能达到要求了,只是如果文件夹删光了还没有1G的话会有点小错误(我测试的时候是20G)  保存为 *.vbs
使用的时候请把f/ghost 改为E盘的那个文件夹

[ Last edited by zhoushijay on 2007-4-18 at 05:22 PM ]

2007-4-19 06:18
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
bjsh
银牌会员





积分 2000
发帖 621
注册 2007-1-1
状态 离线
『第 9 楼』:  

纠正ls的一个小错误

  Quote:
如果D盘剩余空间大于E盘那个文件夹1G

说剩余空间-文件size 是否大于1G; 而非剩余空间是否大于1G;

cmd /c dir /od /ad /b d:\>folder.txt

这个会有问题的;

首先如果 该盘为系统盘的话;很可能把隐藏的重要文件夹删除;
所以建议加上 -h

同时/od的排序是按生成时间排序的;

而lz要求的是最早的访问时间;

应该用wmic或/ta来解决这个问题;

[ Last edited by bjsh on 2007-4-18 at 08:15 PM ]

2007-4-19 07:30
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
bjsh
银牌会员





积分 2000
发帖 621
注册 2007-1-1
状态 离线
『第 10 楼』:  

此题用批处理来写

关键在于 批处理 在处理大数字上有欠缺;

而且在取得文件夹大小上也有欠缺;

而vbs在这两方面要好的多;

不过并不说明批处理无法解决;只是麻烦了点;

2007-4-19 07:33
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
bjsh
银牌会员





积分 2000
发帖 621
注册 2007-1-1
状态 离线
『第 11 楼』:  

贴出批处理版的;加了些注释;

  Quote:

  1. @echo off & setlocal enabledelayedexpansion
  2. :loop
  3. rem 得到d盘的剩余空间
  4. for /f %%i in ('wmic LOGICALDISK where "name='d:'" get freespace ^|more +1') do set "d_free=%%i"
  5. rem 得到e盘某文件夹的大小
  6. for /f "tokens=3" %%a in ('dir e:\某文件夹 /s /a ^| find "个文件"') do set "file_size=%%a" && set "file_size=!file_size:,=!"
  7. rem 进行差值计算 (默认为剩余空间大于文件夹的大小;否则自行修改代码)
  8. set "x=%d_free%"
  9. set "y=%file_size%"
  10. set "result="
  11. set "flag="
  12. call :c
  13. rem 返回result 判断result是否大于1G
  14. set "x=%result%"
  15. set "y=1073741824"
  16. set "result="
  17. set "flag="
  18. call :c
  19. rem 返回值P等于-1说明小于1G;返回值P等于1说明大于1G
  20. if "%p%"=="1" 1.bat
  21. if "%p%"=="-1" goto clean
  22. :clean
  23. rem 获取访问时间
  24. for /f %%C in ('echo %date%') do set "today=%%C" && set "today=!today:-=!"
  25. set "small=%today%"
  26. pushd d:
  27. for /f "delims=" %%A in ('dir /ad-h/b') do set "folder=%%A" && CALL :f_time
  28. echo 访问时间最早的文件是 d:\%ear_folder% ;是否要删除 & pause
  29. rd /s /q d:\%ear_folder%
  30. goto loop
  31. goto exit
  32. :f_time
  33. for /f %%B in ('wmic fsdir where "name='d:\\%folder%'" get LastAccessed ^|more +1') do set "ear=%%B"
  34. if %ear:~0,8% lss %small% set "small=%ear:~0,8%" && set "ear_folder=%folder%"
  35. goto exit
  36. rem 计算函数
  37. :c
  38. if defined flag (set /a "next=%x:~-1%-1") else (set /a "next=%x:~-1%")
  39. set /a "last=%next%-%y:~-1%"
  40. set "t=%last%"
  41. if %last% geq 0 (set "flag=") else (set /a "last=10+%next%-%y:~-1%" & set "flag=flag")
  42. set "result=%last%%result%"
  43. set "x=%x:~0,-1%"
  44. set "y=%y:~0,-1%"
  45. if "%x%"=="" if not "%y%"=="" set /a "p=-1" & goto exit
  46. if "%x%"=="" if %t% lss 0 set /a "p=-1" & goto exit
  47. if "%y%"=="" if not "%x%"=="" set "y=0" && set /a "p=1"
  48. if "%y%"=="" if "%x%"=="" if %t% geq 0 set /a "p=1" && goto exit
  49. goto c
  50. :exit
         BJSH发表于:  2007-04-18  18:24



2007-4-19 07:35
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
bjsh
银牌会员





积分 2000
发帖 621
注册 2007-1-1
状态 离线
『第 12 楼』:  

仅仅是数值的计算批处理就用了30行
而vbs只需要两行代码;

[ Last edited by bjsh on 2007-4-18 at 06:38 PM ]

2007-4-19 07:37
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
chkau
初级用户





积分 101
发帖 47
注册 2007-4-18
状态 离线
『第 13 楼』:  

首先非常感谢bjsh大哥
其次小弟再问一下,我运行这个命令输出的需要删除的文件夹和我dir /od /ta排列出最后一次访问时间最早的文件夹不一样呢?

2007-4-19 09:13
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
chkau
初级用户





积分 101
发帖 47
注册 2007-4-18
状态 离线
『第 14 楼』:  

我的表达能力真是差......
估计bjsh大哥认为的是最早有访问记录的文件夹
而我想要表达的意思是上一次访问时间最早的文件夹
各位大哥...不好意思

2007-4-19 09:19
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
bjsh
银牌会员





积分 2000
发帖 621
注册 2007-1-1
状态 离线
『第 15 楼』:  

那你dir /od /ta 后;
你是想删除第一个呢?还是想删除最后一个呢?

2007-4-19 09:37
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
« [1] [2] »
请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: