中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 求所有分区剩余空间的精确值(以MB为单位)
作者:
标题: 求所有分区剩余空间的精确值(以MB为单位) 上一主题 | 下一主题
namejm
荣誉版主

batch fan


积分 5226
发帖 1737
注册 2006-3-10
来自 成都
状态 离线
『楼 主』:  求所有分区剩余空间的精确值(以MB为单位)

  通过 dir 命令获取剩余空间的字节数字之后,转换成以MB为单位的数值,往往容易受到CMD不能处理超过 2^31-1 的数值的限制,从而难以直接把字节数转换为MB,以下代码模拟手工计算整数相除的过程,顺利地解决了这一难题:
@echo off

setlocal enabledelayedexpansion

:Main
cls
set /a num2=1024*1024
for %%i in (c d e f g h i j k l m n o p q r s t u v w x y z) do (
    set driver=%%i
    set num1=0
    set num3_str=
    set num4=
    for /f "tokens=3" %%j in ('dir /a /-c %%i:\ 2^>nul') do set num1=%%j
    if not "!num1!"=="0" (
        call :loop
        for /f "delims=0 tokens=*" %%k in ("!num3_str!") do set num3_str=%%k
        if not defined num3_str (
            echo.&echo        %%i 盘尚未被使用,具体空间无法查询&echo.
        ) else (
            echo.&echo        %%i 盘剩余空间为 !num3_str! MB&echo.
        )
    )
)
pause
goto Main

:loop
:: 求商
set /a num3=%num4%%num1:~0,1%/%num2%
:: 求商序列
set num3_str=%num3_str%%num3%
:: 求余
set /a num4=%num4%%num1:~0,1%%%%num2%
if %num4% equ 0 set num4=
set num1=%num1:~1%
if not "%num1%"=="" goto loop
goto :eof
  更多信息,可以参考这个帖子:[已结]如何显示磁盘的剩余空间?

  发现 call echo 中的 call 属于多余的命令,精简一下;判断某个分区是否存在,在 for 语句中可以不用 if exist 语句,直接用 dir %%i 2>nul 的格式就可以了,再精简一下。

  经 boy0750 提醒,发现某分区被使用0字节的时候, dir /-c %%i:\ 会提取不到可用字节数,改成 dir /a /-c %%i:\ 之后,此问题得到部分解决(当分区不存在任何文件的时候,提取不到剩余空间的字节数,目前只能做提示)。感谢 boy0750 的提醒。

[ Last edited by namejm on 2007-8-12 at 03:18 AM ]

   此帖被 +33 点积分       点击查看详情   
评分人:【 redtek 分数: +10  时间:2007-3-11 22:05
评分人:【 lxmxn 分数: +10  时间:2007-3-11 23:07
评分人:【 zh159 分数: +11  时间:2007-3-12 02:40
评分人:【 axi 分数: +2  时间:2007-3-21 09:27




尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
2007-3-11 13:14
查看资料  发短消息 网志   编辑帖子  回复  引用回复
lxmxn
版主




积分 11386
发帖 4938
注册 2006-7-23
状态 离线
『第 2 楼』:  


  版主牛X啊,佩服……


2007-3-11 13:29
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
zh159
金牌会员




积分 3687
发帖 1467
注册 2005-8-8
状态 离线
『第 3 楼』:  

来个BAT+VBS的

使用延迟变量:
@echo off
setlocal enabledelayedexpansion

>tmp.vbs echo result = wscript.arguments(1)/1024/1024
>>tmp.vbs echo Wscript.Echo wscript.arguments(0),"盘剩余空间为",result,"MB"

for %%i in (C D E F G H I J K L M N O P Q R S T U V W X Y Z) do (
    if exist %%i:\ (
        for /f "tokens=3" %%j in ('dir /-c %%i:\') do set num=%%j
    if not "%%j"=="0" cscript //nologo tmp.vbs %%i: !num!
))
del tmp.vbs
pause
exit
不使用延迟变量:
@echo off
>tmp.vbs echo result = wscript.arguments(1)/1024/1024
>>tmp.vbs echo Wscript.Echo wscript.arguments(0),"盘剩余空间为",result,"MB"

for %%i in (C D E F G H I J K L M N O P Q R S T U V W X Y Z) do (
    if exist %%i:\ (
        for /f "tokens=3" %%j in ('dir /-c %%i:\') do set num=%%j
    if not "%%j"=="0" call :loop %%i:
))
del tmp.vbs
pause
exit

:loop
cscript //nologo tmp.vbs %1 %num%
goto :eof


   此帖被 +10 点积分       点击查看详情   
评分人:【 redtek 分数: +10  时间:2007-3-11 22:05


2007-3-11 14:55
查看资料  发短消息 网志   编辑帖子  回复  引用回复
vkill
金牌会员





积分 4103
发帖 1744
注册 2006-1-20
来自 甘肃.临泽
状态 离线
『第 4 楼』:  

win2003里到有几个好命令的

freedisk

diskpart

2007-3-12 08:25
查看资料  发送邮件  访问主页  发短消息 网志   编辑帖子  回复  引用回复
nicesoft
初级用户





积分 98
发帖 47
注册 2007-1-28
状态 离线
『第 5 楼』:  

请教,我只想把D盘的剩余空间存入一个变量中,该怎样写?谢谢

2007-5-1 18:22
查看资料  发短消息 网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


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



论坛跳转: