中国DOS联盟

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

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

中国DOS联盟论坛
现在时间是 2026-06-14 20:57
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 求所有分区剩余空间的精确值(以MB为单位)
楼 主 求所有分区剩余空间的精确值(以MB为单位) 发表于 2007-03-11 13:14 ·  中国 广东 电信
荣誉版主
★★★★
batch fan
积分 5,226
发帖 1,737
注册 2006-03-10 00:38
UID 51697
来自 成都
状态 离线
  通过 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 ]
本帖最近评分记录 (共 4 条) 点击查看详情
评分人分数时间
redtek +10 2007-03-11 22:05
lxmxn +10 2007-03-11 23:07
zh159 +11 2007-03-12 02:40
axi +2 2007-03-21 09:27
尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
2 发表于 2007-03-11 13:29 ·  中国 湖北 武汉 电信
版主
★★★★★
积分 11,386
发帖 4,938
注册 2006-07-23 17:10
UID 59080
状态 离线

  版主牛X啊,佩服……
3 发表于 2007-03-11 14:55 ·  中国 广西 玉林 博白县 电信
金牌会员
★★★★
积分 3,687
发帖 1,467
注册 2005-08-08 12:00
UID 44210
状态 离线
来个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
本帖最近评分记录 (共 1 条) 点击查看详情
评分人分数时间
redtek +10 2007-03-11 22:05
4 发表于 2007-03-12 08:25 ·  中国 甘肃 张掖 电信
金牌会员
★★★★
积分 4,103
发帖 1,744
注册 2006-01-20 13:00
UID 49241
性别 男
来自 甘肃.临泽
状态 离线
win2003里到有几个好命令的

freedisk

diskpart
5 发表于 2007-05-01 18:22 ·  中国 广东 广州 南沙区 电信
初级用户
积分 98
发帖 47
注册 2007-01-28 05:39
UID 77912
性别 男
状态 离线
请教,我只想把D盘的剩余空间存入一个变量中,该怎样写?谢谢
论坛跳转: