中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [挑战6]:硬盘容量的计算。难度[☆☆☆]
作者:
标题: [挑战6]:硬盘容量的计算。难度[☆☆☆] 上一主题 | 下一主题
flyinspace
银牌会员





积分 1206
发帖 517
注册 2007-3-25
状态 离线
『楼 主』:  [挑战6]:硬盘容量的计算。难度[☆☆☆]

呵呵,这一期的挑战系列没有准时在周一出现,请大家原谅(因工作繁忙,跟着几位大侠级

的人物学习调试设备,没有时间啊)

      好了,该扯的也扯了,下面进入正题(硬盘容量的计算)

      现在有 一 个硬盘,但我们不知道这个硬盘分了几个区,每个区的容量是多大,剩余

空间又几何。
      假设这个硬盘的空间为:300G ,按照硬盘厂商的划分标准就是:
              300*1000*1000*1000 的容量。
      硬盘分为 4 个区,其中
盘符        总容量                        剩余容量
-------------------------------------------------------------------------------
C:        20*1024*1024*1024        1000*1024*1024
D:        40*1024*1024*1024        30*1024*1024*1024
E:        80*1024*1024*1024        60*1024*1024*1024
剩余的为 F: 盘  我们已经知道 F:已经使用了 20*1024*1024*1024 的容量。。
-------------------------------------------------------------------------------
那么现在的问题是:F: 的实际容量是多大?

要求:将上述文件存为:   Drivers.txt

从文件中读取这个 硬盘容量的文件,并进行计算。

对容量的计算要求采用 4 舍 5 入的法则,基本单位为M ,不足 1G 的计算剩余容量的实际

大小(精确到 M ),过 1G 的单位为 G ,但要求精确到小数点后三位。

程序使用要求:CMD(可以使用第三方工具,可以结合vbs来做,也可以单独使用vbs来完成)

采用了第三方工具完成目标的(积分为:2分)
完全独立使用cmd完成的(积分为:5分,满分)

难点:提取出正确容量的朋友:1分
        正确使用除法运算的朋友,1分
        精确单位使用良好的:1分
        获取F盘正确容量的 2分。
Drivers.txt
-------------------------------------------------------------------------------
C:        20*1024*1024*1024        1000*1024*1024
D:        40*1024*1024*1024        30*1024*1024*1024
E:        80*1024*1024*1024        60*1024*1024*1024
F:        ?????                        (???-20*1024*1024*1024)
-------------------------------------------------------------------------------
set "Volume_C=" ;精确到字节
set "Volume_D="
set "Volume_E="
set "Volume_F="
set "Real_Volume_C=" 精确到M or G
Dividend:被除数
Divisor:除数
Quotient:商

好了,下面就开始做题了。。

要求输出

C: %Volume_C%(%Real_Volume_C% [M or G]) 此处的M or G 只能存在一个。
d: %Volume_D%(%Real_Volume_D% [M or G])
e: %Volume_E%(%Real_Volume_E% [M or G])
f: %Volume_F%(%Real_Volume_F% [M or G])

输出:
例如: c: 1048576(1000M)
          d: 32212254720(30G)
小于1G容量的用 M 做单位
大于1G容量的用 G 做单位

[ Last edited by flyinspace on 2007-5-9 at 01:23 PM ]



知,不觉多。不知,乃求知
2007-5-8 23:04
查看资料  发短消息 网志   编辑帖子  回复  引用回复
dikex
高级用户

潜水修练批处理



积分 788
发帖 366
注册 2006-12-31
状态 离线
『第 2 楼』:  

取得系统所有分区的空间(单位:字节)可以使用下面的代码,至于精确的计算超大数字太麻烦了,留待下一位-_-
@echo off
setlocal ENABLEDELAYEDEXPANSION
for /f "skip=1 delims=" %%i in ('fsutil fsinfo drives ^| more') do (
   set a=%%i
   for /f "skip=1 delims=" %%a in ('wmic LOGICALDISK where Caption^="!a:~-3,-1!" get size') do echo !a:~-3,-2! %%a
)
pause
[ Last edited by dikex on 2007-5-9 at 12:36 AM ]



正在潜水修练的批处理小白
2007-5-9 00:13
查看资料  发短消息 网志   编辑帖子  回复  引用回复
youxi01
高级用户




积分 846
发帖 247
注册 2006-10-27
来自 湖南==》广东
状态 离线
『第 3 楼』:  

楼上似乎理解错了楼主的意思了.
1F的题目看起来象计算题多点.
而不是查询硬盘的.

2007-5-9 09:46
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
everest79
金牌会员

一叶枝头,万树皆春



积分 2564
发帖 1127
注册 2006-12-25
状态 离线
『第 4 楼』:  

你要标明是什么文件系统,这对计算最后可用空间的精度有影响

2007-5-9 09:50
查看资料  发短消息 网志   编辑帖子  回复  引用回复
zhoushijay
高级用户

Autowalk


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

这道题对什么文件系统有关系吗?纯粹的数字乘乘除除而已。
难点在于读取文本啊,用P处理相对好读点,但是数值太大无法计算
用VBS可以计算但读取有点困难。

2007-5-9 11:54
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
flyinspace
银牌会员





积分 1206
发帖 517
注册 2007-3-25
状态 离线
『第 6 楼』:  

To youxi01:
     主要是查询硬盘的容量(表面上是有了大数运算,但在这里,是可以通过一系列的方法避过的。)
To everest79:
     兄想太多了,只是为了考察综合能力(若是真的不取巧的话,里面的内容是包含了加减乘除取余运算的)
     那么在这里,就会涉及到子程序的调用问题,因为大量的四则运算若还是把加减乘除运算放在一起的话,代码的长度不敢想象:)
     代码写得漂亮的,flyinspace在此另外加 3 分(难点在:合理搭配上,不需要每一句话的注释,但需要在子程序前标明这个子程序是做什么用的,刚用c++写了一个四则运算的小程序,正好来调用这每一个子程序,并看是否正确。)
     ps:现在越来越感觉到算法的重要性了。大家在写这个脚本的时候,可以去网上,推荐CSDN查找大数运算的帖子。



知,不觉多。不知,乃求知
2007-5-9 12:23
查看资料  发短消息 网志   编辑帖子  回复  引用回复
zhoushijay
高级用户

Autowalk


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

我插一句,省略了读取文本。呵呵
只是有些不太理解LZ题目的意思。。。
'C盘
uscb=20*1024*1024*1024-1000*1024*1024
uscm=uscb/1024/1024
uscg=uscm/1024
uscg=round(uscg,3)

alcb=20*1024*1024*1024
alcm=alcb/1024/1024
alcg=alcm/1024
alcg=round(alcg,3)

frcb=1000*1024*1024
frcm=frcb/1024/1024
frcg=frcm/1024
frcg=round(frcg,3)

'D盘
usdb=40*1024*1024*1024-30*1024*1024*1024
usdm=usdb/1024/1024
usdg=usdm/1024
usdg=round(usdg,3)

aldb=40*1024*1024*1024
aldm=aldb/1024/1024
aldg=aldm/1024
aldg=round(aldg,3)

frdb=30*1024*1024*1024
frdm=frdb/1024/1024
frdg=frdm/1024
frdg=round(frdg,3)

'E盘
useb=80*1024*1024*1024-60*1024*1024*1024
usem=useb/1024/1024
useg=usem/1024
useg=round(useg,3)

aleb=80*1024*1024*1024
alem=aleb/1024/1024
aleg=alem/1024
aleg=round(aleg,3)

freb=60*1024*1024*1024
frem=freb/1024/1024
freg=frem/1024
freg=round(freg,3)


'F盘
usfb=20*1024*1024*1024
usfm=usfg/1024/1024
usfg=usfm/1024
usfg=round(usfg,3)

alfb=300*1024*1024*1024-alcb-aldb-aleb
alfm=alfb/1024/1024
alfg=alfm/1024
alfg=round(alfg,3)

frfb=alfb-usfb
frfm=frfg/1024/1024
frfg=frfm/1024
frfg=round(frfg,3)




msgbox "C盘总大小:  "&alcg&"G"&" "&alcm&"M"&" "&alcb&"B"&chr(10)&"C盘已用空间:"&uscg&"G"&" "&uscm&"M"&" "&uscb&"B"&chr(10)&"C盘可用空间:"&frcg&"G"&" "&frcm&"M"&" "&frcb&"B"&chr(10)&chr(10)&"D盘总大小  :"&aldg&"G"&" "&aldm&"M"&" "&aldb&"B"&chr(10)&"D盘已用空间:"&usdg&"G"&" "&usdm&"M"&" "&usdb&"B"&chr(10)&"D盘可用空间:"&frdg&"G"&" "&frdm&"M"&" "&frdb&"B"&chr(10)&chr(10)&"E盘总大小  :"&aleg&"G"&" "&alem&"M"&" "&aleb&"B"&chr(10)&"E盘已用空间:"&useg&"G"&" "&usem&"M"&" "&useb&"B"&chr(10)&"E盘可用空间:"&freg&"G"&" "&frem&"M"&" "&freb&"B"&chr(10)&chr(10)&"F盘总大小  :"&alfg&"G"&" "&alfm&"M"&" "&alfb&"B"&chr(10)&"F盘已用空间:"&usfg&"G"&" "&usfm&"M"&" "&usfb&"B"&chr(10)&"F盘可用空间:"&frfg&"G"&" "&frfm&"M"&" "&frfb&"B",vbinformation,"$$$夜七制作$$$"


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

Autowalk


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

额……C盘可用空间好像写错了

2007-5-9 13:15
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
youxi01
高级用户




积分 846
发帖 247
注册 2006-10-27
来自 湖南==》广东
状态 离线
『第 9 楼』:  

那楼主的意思是:

     先读取盘数,然后把前面的盘符的容量等读出来,留着最后一个要算(就是不准读)是这个意思吗?

2007-5-9 23:50
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
wld
初级用户





积分 61
发帖 32
注册 2007-5-9
状态 离线
『第 10 楼』:  

学习

2007-5-10 16:51
查看资料  发短消息 网志   编辑帖子  回复  引用回复
flyinspace
银牌会员





积分 1206
发帖 517
注册 2007-3-25
状态 离线
『第 11 楼』:  



  Quote:
Originally posted by youxi01 at 2007-5-9 11:50 PM:
那楼主的意思是:

     先读取盘数,然后把前面的盘符的容量等读出来,留着最后一个要算(就是不准读)是这个意思吗?

嗯,是呀。。

所有的项目都给出了条件呢。。

用四则运算就可以求出来的。。



知,不觉多。不知,乃求知
2007-5-10 17:19
查看资料  发短消息 网志   编辑帖子  回复  引用回复
hhasee
初级用户





积分 185
发帖 88
注册 2008-5-12
状态 离线
『第 12 楼』:  

能发一个在VISTA下也可以用的吗?

2009-1-10 18:11
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
netbenton
银牌会员

批处理编程迷


积分 1916
发帖 752
注册 2008-12-28
来自 广西
状态 离线
『第 13 楼』:  

@echo off&setlocal enabledelayedexpansion
::for 内的临时变量用_v1,_v2,_v(n)
::disk=硬盘总容量/1024
::_n=分区数

::for1 读邓正确的字符串,if 是盘f:,去除??-()等符号
::   _d:盘符  _zc:总容量串  _yc:已用空间串

::for2 字符串分段
::  _zt:总容量串头部分  _zw:尾  _yt:已用空间串头部分  _yw:尾

::for3 计算F:总空间及剩余空间
::  使用临时变量 _v1,_v2,_v3

::for4 处理以M/G为单位的结果
::  _zm:总容量  _ym:已用空间  _sm:乘余空间

::for5 处理成字节(B),兆M/G
::   _zb:总字节B   _yb:已用字节B   _sb:剩余字节

::for6 显示输出


echo off
set /a disk=300*1024*1024

::for1 读正确的数字串,去除??()等符号
set _n=0
echo.读入数据&echo.************************************
for /f "tokens=1,2,3* delims= " %%i in ('findstr : drivers.txt') do (
set /a _n+=1&echo %%i %%j %%k
set _v1=%%i&set _v2=%%j&set _v3=%%k
if "!_v1!"=="F:" set _v2=!_v2:?=!&set _v3=!_v3:*-=!&set _v3=!_v3:^)=!&set _y!_n!=!_v3!
set _d!_n!=!_v1!&set _z!_n!=!_v2!&set _s!_n!=!_v3!
)
echo.************************************&echo.&echo.

::for2 数字串分段处理
::  _zt:总容量串头部分  _zw:尾  _yt:已用空间串头部分  _yw:尾
for /l %%a in (1,1,!_n!) do (
set _v2=!_z%%a!&set _v3=!_s%%a!&set _v4=!_y%%a!
set _zt%%a=!_v2:~0,-5!
set _zw%%a=!_v2:~-4!
set _st%%a=!_v3:~0,-5!
set _sw%%a=!_v3:~-4!
set _yt%%a=!_v4:~0,-5!
set _yw%%a=!_v4:~-4!
)


::for3 计算F:总空间及剩余空间
::  使用临时变量 _v1,_v2,_v3
set _v1=
for /l %%a in (1,1,!_n!) do (
set /a _zt%%a=!_zt%%a!&set /a _st%%a=!_st%%a!&set /a _yt%%a=!_yt%%a!
if "!_d%%a!"=="F:" (set /a _zt%%a=!disk!-!_v1!&set /a _st%%a=!_zt%%a!-!_yt%%a!&set _zw%%a=!_yw%%a!) else (set /a _yt%%a=!_zt%%a!-!_st%%a!&set _yw%%a=!_zw%%a!&set /a _v1=!_v1!+!_zt%%a!)
)


::for4 计算以M单位,大于1000M以G为单位的结果
::  _zm:总容量 _sm:乘余空间 _ym:已用空间
for /l %%a in (1,1,!_n!) do (
set /a _zm%%a=!_zt%%a!/1024&set /a _sm%%a=!_st%%a!/1024&set /a _ym%%a=!_yt%%a!/1024
if !_zm%%a! leq 1000 (set _zm%%a=^(!_zm%%a!M^)) else (set /a _zm%%a=!_zm%%a!/1024 & set _zm%%a=^(!_zm%%a!G^))
if !_sm%%a! leq 1000 (set _sm%%a=^(!_sm%%a!M^)) else (set /a _sm%%a=!_sm%%a!/1024 & set _sm%%a=^(!_sm%%a!G^))
if !_ym%%a! leq 1000 (set _ym%%a=^(!_ym%%a!M^)) else (set /a _ym%%a=!_ym%%a!/1024 & set _ym%%a=^(!_ym%%a!G^))
)


::for5 处理成字节显示(B)
::   _zb:总B _yb:已用B _sb:剩余字节
for /l %%a in (1,1,!_n!) do (
rem 把%1 乘以 %2 放入%3所指的变量中
call :sub !_zt%%a! !_zw%%a! _zb%%a
call :sub !_st%%a! !_sw%%a! _sb%%a
call :sub !_yt%%a! !_yw%%a! _yb%%a
)

::for6 显示输出
echo.硬盘数据:
echo._______________________________________________________________________________
for /l %%a in (1,1,!_n!) do (echo.!_d%%a! 总容量:!_zb%%a!!_zm%%a!  剩余:!_sb%%a!!_sm%%a!  已用:!_yb%%a!!_ym%%a!)
echo._______________________________________________________________________________
pause
goto :eof

:sub
set _v1=%1&set _v2=%2&set _v3=%3
set /a _vt=!_v1:~0,-5!*!_v2!
set /a _vw=!_v1:~-5!*!_v2!
set _vx=!_vt!00000
set /a _vy=!_vx:~-9!+!_vw!
set _vx=!_vx:~0,-9!
set _v4=!_vy:~0,-9!
if not "!_va!"=="" set /a _vx=!_vx!+!_v4!
set !_v3!=!_vx!!_vy!

goto :eof

[ Last edited by netbenton on 2009-1-11 at 23:07 ]



精简
[你的+我的+他的]=>[大家的]    个人网志   
2009-1-11 23:04
查看资料  发送邮件  发短消息 网志  OICQ (37659560)  编辑帖子  回复  引用回复
knoppix7
银牌会员





积分 1287
发帖 634
注册 2007-5-2
来自 cmd.exe
状态 离线
『第 14 楼』:  

DISKPART> list disk

外部命令的定义还没有...就这样了...

2009-1-12 09:40
查看资料  发短消息 网志   编辑帖子  回复  引用回复
netbenton
银牌会员

批处理编程迷


积分 1916
发帖 752
注册 2008-12-28
来自 广西
状态 离线
『第 15 楼』:  

不解:
或许还不了解楼主的意思!
还要定义什么外部命令呀?



精简
[你的+我的+他的]=>[大家的]    个人网志   
2009-1-12 14:46
查看资料  发送邮件  发短消息 网志  OICQ (37659560)  编辑帖子  回复  引用回复

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


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



论坛跳转: