bat批处理脚本获取磁盘空间数值与Windows显示不一致问题求助
偏差原因
你猜测的单位换算差异是核心原因,除此之外还有脚本本身的计算逻辑问题:
fsutil volume diskfree返回的容量单位为字节(Byte),你直接截取后9位的操作等价于按1GB=10003字节的十进制规则换算,但Windows系统显示的容量是按二进制规则计算的(Windows标注的GB实际为GiB,1GiB=10243=1073741824字节),两个换算系数差约7%,直接导致脚本输出结果偏高。- 直接截断后9位的操作本身会丢失精度,属于无进位取整,进一步放大了误差。
修正后的批处理脚本
修正后适配Windows的计算规则,可保留1位小数和系统显示精度对齐:
@echo off & setlocal ENABLEDELAYEDEXPANSION :: 清空输出文件 type nul > disk_usage.txt :: 可自行修改需要查询的盘符列表 set "volumes=C: D:" for %%v in (%volumes%) do ( set "diskavail=" set "disktotal=" for /f "tokens=1*delims=:" %%i in ('fsutil volume diskfree %%v') do ( set "diskfree=!disktotal!" set "disktotal=!diskavail!" set "diskavail=%%j" ) :: 去除返回值中的空格避免计算报错 set "disktotal=!disktotal: =!" set "diskavail=!diskavail: =!" :: 用整数运算模拟浮点数计算,保留1位小数 set /a total_gib=!disktotal! / 107374182, avail_gib=!diskavail! / 107374182 set "total_gib=!total_gib:~0,-1!.!total_gib:~-1!" set "avail_gib=!avail_gib:~0,-1!.!avail_gib:~-1!" :: 写入结果 echo 143,Volume %%v,!total_gib! GB,!avail_gib! GB >> disk_usage.txt ) endlocal
如果不需要小数精度,直接把计算逻辑改为set /a total_gib=!disktotal! / 1073741824, avail_gib=!diskavail! / 1073741824即可。
修正说明
- 换算系数从10^9改为1073741824(1024的三次方),和Windows系统的容量计算规则完全一致
- 优化了数值计算逻辑,通过先扩大10倍运算的方式实现小数精度保留,避免直接截断导致的精度损失
- 增加了返回值去空格处理,避免
fsutil返回结果中的空格导致计算错误 - 优化了盘符遍历逻辑,新增查询盘符只需修改
volumes变量即可,无需重复编写循环代码
内容的提问来源于stack exchange,提问作者yaodav
相关产品推荐
相关产品推荐

