Board logo

标题: 求所有分区剩余空间的精确值(以MB为单位) [打印本页]

作者: namejm     时间: 2007-3-11 13:14    标题: 求所有分区剩余空间的精确值(以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 ]
作者: lxmxn     时间: 2007-3-11 13:29

  版主牛X啊,佩服……

作者: zh159     时间: 2007-3-11 14:55
来个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

作者: vkill     时间: 2007-3-12 08:25
win2003里到有几个好命令的

freedisk

diskpart
作者: nicesoft     时间: 2007-5-1 18:22
请教,我只想把D盘的剩余空间存入一个变量中,该怎样写?谢谢