You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 17:30:04