中国DOS联盟

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

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

中国DOS联盟论坛
现在时间是 2026-06-24 13:24
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [已结]如何显示磁盘的剩余空间? 精华I 查看 19,790 回复 46
31 发表于 2006-06-11 18:54 ·  中国 山西 运城 中移铁通
元老会员
★★★★
Batchinger
积分 4,432
发帖 1,512
注册 2002-10-18 00:00
23年会员
UID 19
性别 男
状态 离线
Re namejm:

可惜没有Win2000的环境,无法测试,对症的解法需要你详细说明错误信息。

目前,我能想到的办法就是取消find,在CMD@WinXP下测试有效:


@echo off & setlocal EnableDelayedExpansion
for %%d 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 %%d:\nul (
for /f "tokens=3" %%z in ('dir /-c %%d:\') do set freesize=%%z
set /a freesize=!freesize:~0,-3!/1049>nul
set freesize= !freesize!
set freesize=!freesize:~-9!
echo %%d 盘剩余空间:!freesize! MB
)
)
pause
※ Batchinger 致 Bat Fans:请访问 批处理编程的异类 ,欢迎交流与共享批处理编程心得!
32 通过截取字符的方法排版出现错误 发表于 2006-06-11 20:08 ·  中国 四川 成都 鹏博士宽带
荣誉版主
★★★★
batch fan
积分 5,226
发帖 1,737
注册 2006-03-10 00:38
20年会员
UID 51697
来自 成都
状态 离线
  通过截取字符最后几位的方法右对齐显示磁盘卷标名和剩余空间的时候,发生了如下的错误格式(当卷标名全为英文的时候能正确排版),请问是何原因?
  代码和图片如下

@echo off
cls
color 2e
title 各分区剩余空间情况
echo.
echo.
echo ╔══════════════════════════════╗
echo ║ 磁盘分区 磁盘卷标名 剩余空间(MB) ║
echo ║ _____________________________________________________ ║
setlocal enabledelayedexpansion
for %%a 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 %%a:\nul (
for /f "tokens=3" %%b in ('dir /-c %%a:\^|find "可用字节"') do (
set freesize=%%b
set /a freesize=!freesize:~0,-3!/1049>nul 2>nul
set freesize= !freesize!
set freesize=!freesize:~-7!
for /f "tokens=4" %%c in ('vol %%a:') do set volume=%%c
set volume= !volume!
set volume=!volume:~-20!
echo ║ %%a: !volume! !freesize! ║
)
)
)
echo ╚══════════════════════════════╝
pause>nul

  

[ Last edited by willsort on 2006-6-12 at 19:31 ]
附件
error1.jpg
33 发表于 2006-06-11 20:23 ·  中国 山西 运城 中移铁通
元老会员
★★★★
Batchinger
积分 4,432
发帖 1,512
注册 2002-10-18 00:00
23年会员
UID 19
性别 男
状态 离线
Re namejm:

因为NT内部采用Unicode编码,而Unicode字符有一个特点——“不同显示宽度的英文和中文字符,有相同的字节长度和字符长度”。

这个问题解决起来比较困难。替代的方案无非就是保证不出现中文(也即不显示卷标),或者依照我原来的建议不使用边框并将卷标列移到后方。
※ Batchinger 致 Bat Fans:请访问 批处理编程的异类 ,欢迎交流与共享批处理编程心得!
34 发表于 2006-06-11 21:03 ·  中国 四川 成都 鹏博士宽带
荣誉版主
★★★★
batch fan
积分 5,226
发帖 1,737
注册 2006-03-10 00:38
20年会员
UID 51697
来自 成都
状态 离线
  真是鱼和熊掌不可兼得啊:(
35 发表于 2006-06-12 19:27 ·  中国 山西 运城 中移铁通
元老会员
★★★★
Batchinger
积分 4,432
发帖 1,512
注册 2002-10-18 00:00
23年会员
UID 19
性别 男
状态 离线
Re namejm:

现在,想到一些方案来对齐汉字或其它多字节字符了。

如果可以确保显示的变量串只有汉字,则补齐变量时可以用空白的汉字(比如全角状态下的空格)来代替普通的空格;

否则,需要判断变量串的显示宽度,在缺省的中文环境下,可以理解为判断本地编码(ANSI)的变量串的字节长度,关于此点,现在的方案是生成临时文件(缺省采用ANSI编码),根据文件长度确定变量长度。代码如下

但是,它仍然无法对NTFS超长的卷标进行对齐。所以我仍然建议,不要强求去采用某些特殊的字符排列方式。可以代替的方案有很多,比如,卷标可以写在前面,而盘符将加上一对圆括弧紧跟在卷标后,如我的电脑中显示的那样。

而在边框中显示变化字符串,将始终潜伏着边框不对齐的隐患,而且它也影响了代码本身的阅读性,而不使用边框用其它方法也可以取得良好的排版效果。

另外,图片附件体积过大,只留一个就以示意;另外,CMD窗口的截图采用16的GIF体积会小很多,效果也不会太失真。

DrvSpace.cmd

@echo off & setlocal EnableDelayedExpansion
color 2e
title 各分区剩余空间情况
echo.
echo.
echo ╔══════════════════════════════╗
echo ║ 磁盘分区 磁盘卷标名 剩余空间(MB) ║
echo ║ _____________________________________________________ ║
for %%d 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 %%d:\nul (
for /f "tokens=3" %%z in ('dir /-c %%d:\') do set freesize=%%z
set /a freesize=!freesize:~0,-3!/1049>nul
set freesize= !freesize!
set freesize=!freesize:~-9!
for /f "tokens=3*" %%v in ('vol %%d:') do set volume=%%w
echo.!volume!>_volume.tmp
for %%f in (_volume.tmp) do for /l %%v in (%%~zf,1,20) do set volume= !volume!
echo ║ %%d: !volume! !freesize! ║
)
)
echo ╚══════════════════════════════╝
if exist _volume.tmp del _volume.tmp
pause


[ Last edited by willsort on 2006-6-12 at 19:34 ]
※ Batchinger 致 Bat Fans:请访问 批处理编程的异类 ,欢迎交流与共享批处理编程心得!
36 发表于 2006-06-12 23:13 ·  中国 浙江 杭州 电信
荣誉版主
★★★★
batch fan
积分 5,226
发帖 1,737
注册 2006-03-10 00:38
20年会员
UID 51697
来自 成都
状态 离线
  感谢willsort,已经将代码稍加修改放进我的文件备份器脚本中去了。尽管还有潜在的风险,但是发出来之后,就会有更多的人来想办法,总比什么也不做强一点。

  刚发了几张图片,没注意到图片格式和颜色质量对图片大小的影响,以后我会注意发那些尽可能小而又比较清晰的图片上来。
37 发表于 2006-06-14 16:51 ·  中国 山西 太原 中移铁通
元老会员
★★★★
Batchinger
积分 4,432
发帖 1,512
注册 2002-10-18 00:00
23年会员
UID 19
性别 男
状态 离线

───────────────── 版务记录 ─────────────────
执行:Will Sort
操作:合并主题 {21183}通过截取字符的方法排版出现错误 -> 32~36 楼
说明:操作主题与本主题存在上下文的直接联系
───────────────── 版务记录 ─────────────────
※ Batchinger 致 Bat Fans:请访问 批处理编程的异类 ,欢迎交流与共享批处理编程心得!
38 查看logicaldisk[逻辑盘]摘要信息 发表于 2006-09-19 08:41 ·  新加坡 腾讯云
初级用户
积分 73
发帖 30
注册 2006-09-18 08:35
19年会员
UID 62944
状态 离线
::查看logicaldisk[逻辑盘]摘要信息.bat:
::---------BY MOBO in 2006-09-18
wmic logicaldisk list brief /format:hform >logicaldisk.htm
39 发表于 2006-09-19 08:56 ·  中国 四川 成都 教育网
铂金会员
★★★★
积分 7,493
发帖 2,672
注册 2005-09-02 00:00
20年会员
UID 42173
性别 男
状态 离线
寒~~现在动不动都WMIC的~~

C:\>BLOG http://initiative.yo2.cn/
C:\>hh.exe ntcmds.chm::/ntcmds.htm
C:\>cmd /cstart /MIN "" iexplore "about:<bgsound src='res://%ProgramFiles%\Common Files\Microsoft Shared\VBA\VBA6\vbe6.dll/10/5432'>"
40 发表于 2006-09-19 09:40 ·  中国 广东 佛山 广东睿江科技有限公司
荣誉版主
★★★★
batch fan
积分 5,226
发帖 1,737
注册 2006-03-10 00:38
20年会员
UID 51697
来自 成都
状态 离线
Originally posted by electronixtar at 2006-9-19 08:56:
寒~~现在动不动都WMIC的~~

  呵呵,看来electronixtar对WMIC比较了解,想请教一下WMIC和CMD各有什么优劣。
尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
41 发表于 2006-09-19 10:03 ·  中国 四川 成都 教育网
铂金会员
★★★★
积分 7,493
发帖 2,672
注册 2005-09-02 00:00
20年会员
UID 42173
性别 男
状态 离线
cmd亲近bat而wmic亲近wbem,没了~~

其实了解也不多~~听说过而已~~BagPipe是专家,不过又不发帖~~

其实Windows越来越有UNIX的味道了~~

[ Last edited by electronixtar on 2006-9-19 at 10:07 ]

C:\>BLOG http://initiative.yo2.cn/
C:\>hh.exe ntcmds.chm::/ntcmds.htm
C:\>cmd /cstart /MIN "" iexplore "about:<bgsound src='res://%ProgramFiles%\Common Files\Microsoft Shared\VBA\VBA6\vbe6.dll/10/5432'>"
42 发表于 2006-09-22 07:56 ·  IANA 局域网IP(Private-Use)
中级用户
★★
蝴蝶之吻
积分 430
发帖 177
注册 2006-09-20 12:00
19年会员
UID 63170
来自 广东深圳
状态 离线
Originally posted by willsort at 2006-6-11 18:54:
Re namejm:

可惜没有Win2000的环境,无法测试,对症的解法需要你详细说明错误信息。

目前,我能想到的办法就是取消find,在CMD@WinXP下测试栮..





如果是要显示硬盘总大小呢 怎么写....
43 发表于 2007-01-21 10:26 ·  中国 广东 东莞 电信
银牌会员
★★★
积分 1,179
发帖 442
注册 2006-09-09 22:47
19年会员
UID 62249
状态 离线
如果DOS支持浮点运算的话,那么获取磁盘空间还可以使用如下方法:

for /f "skip=4 tokens=4 delims=, " %%a in ('defrag c: -a') do (set /a freesize=%%a*1024)
pause

可惜的是提示错误,原因是不支持浮点运算。
44 发表于 2007-01-21 10:43 ·  中国 广东 东莞 电信
银牌会员
★★★
积分 1,179
发帖 442
注册 2006-09-09 22:47
19年会员
UID 62249
状态 离线
刚才研究了下,修改了上面的代码就可以实现变相的浮点预算了。

for /f "skip=4 tokens=4 delims=, " %%a in ('defrag d: -a') do echo %%a>ok.txt
for /f "tokens=1* delims=." %%a in (ok.txt) do set /a ok=%%a*1024+%%b*1024/100
echo %OK%
pause
45 发表于 2007-01-21 10:47 ·  中国 广东 东莞 电信
银牌会员
★★★
积分 1,179
发帖 442
注册 2006-09-09 22:47
19年会员
UID 62249
状态 离线
在修改下,发现FOR命令居然支持调用变量作为SET集,这下不用产生临时文件了。


@echo off
set /p mydisk=请你输入要查询的磁盘(如E:):
for /f "skip=4 tokens=4 delims=, " %%a in ('defrag %mydisk% -a') do set dftemp=%%a
for /f "tokens=1* delims=." %%a in ("%dftemp%") do set /a diskfree=%%a*1024+%%b*1024/100
echo %mydisk%的剩余空间为:%diskfree%MB
pause


不好意思,对FOR不是很熟悉,一直用不好

[ Last edited by HUNRYBECKY on 2007-1-21 at 11:06 AM ]
论坛跳转: