找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
查看: 1045|回复: 24

[分享] 迅速查看当前内置和外接磁盘全部分区的剩余空间

[复制链接]
发表于 7 天前 | 显示全部楼层 |阅读模式
本帖最后由 redyear2026 于 2026-4-23 09:44 编辑

获取磁盘剩余空间的方法有多种,以下的批处代码选用 win 和主流 pe 系统均自带的 fsutil.exe
备注:win11 高版本(25H2)已彻底移除了 wmic 命令行功能

  1. @echo off &if "%~1"=="" "%~f0" 1|sort /r &pause&exit/b
  2. setlocal enabledelayedexpansion &set "z=" &for /l %%n in (1,1,16) do set "b= !b!"
  3. for /f "delims=" %%D in ('fsutil fsinfo drives') do set "allD=%%D"
  4. for %%d in (%allD:* =%) do (set "z="
  5.    for /f "tokens=2 delims=:(" %%z in ('fsutil volume diskfree %%d') do if not defined z (
  6.      set "z=%%z" &set "z=!z: =!" &set "z=!z:,=!"
  7.      if "!z:~,1!" geq "1" if "!z:~,1!" leq "9" (set "z=!b!!z!" &set "z=!z:~-16!" &echo,!z!字节 %%d)) )
  8. exit/b
复制代码

    有些 pe 系统精简了 fsutil.exe,无法运行以上代码。
    以下再给一版批处代码,只用 reg 和 dir 操作,其主要依据是所有盘区根目录下的系统隐藏目录 $RECYCLE.BIN,用此通过 dir /a 定点加速析出所在盘区的剩余空间。
    其实,沿用古老的方法 dir x:\ + findstr 对整个盘区根目录处理也可以,只不过一旦遭遇那些 '地大物博' 的根目录,此法会很费时。



  1. @echo off &if "%~1"=="" "%~f0" 1|sort /r &pause&exit/b
  2. setlocal enabledelayedexpansion &for /l %%n in (1,1,16) do set "b= !b!"
  3. for /f "tokens=2 delims=\: " %%d in ('reg query HKLM\SYSTEM\MountedDevices^|findstr /i "\\[c-z]:" ') do (
  4.     set "z="
  5.     for /f "tokens=3 delims= " %%z in ('dir /a/-c "%%d:\$RECYCLE.BIN" 2^>nul') do set "z=%%z"
  6.     if defined z set "z=!b!!z!" &set "z=!z:~-16!" &echo,!z!字节 %%d:)
  7. exit/b
复制代码








发表于 7 天前 | 显示全部楼层
本帖最后由 a66 于 2026-4-22 15:09 编辑

    自动遍历电脑所有磁盘(C: D: E:…)
    过滤光驱、空盘符、无介质驱动器
    输出纯数字剩余字节数
    数字自动右对齐,排版整齐
    按剩余空间从大到小排序输出


  1. @echo off
  2. :: 顶层注释用 :: 没问题(非循环体)
  3. :: 无参数时脚本自调用,通过管道排序后输出,实现磁盘从大到小排列
  4. if "%~1"=="" "%~f0" 1|sort /r &pause&exit/b

  5. :: 启用延迟环境变量扩展,循环中修改变量必须开启
  6. setlocal enabledelayedexpansion
  7. :: 清空变量 z,定义变量 b 为 16 个空格(用于数字右对齐)
  8. set "z=" &for /l %%n in (1,1,16) do set "b= !b!"

  9. :: 获取系统所有磁盘盘符列表
  10. for /f "delims=" %%D in ('fsutil fsinfo drives') do set "allD=%%D"

  11. :: 遍历所有磁盘盘符
  12. for %%d in (%allD:* =%) do (
  13.     set "z="
  14.     rem 嵌套循环:用 fsutil 查询当前磁盘剩余空间,提取关键数值
  15.     for /f "tokens=2 delims=:(" %%z in ('fsutil volume diskfree %%d') do if not defined z (
  16.         rem 给变量 z 赋值剩余空间原始数据
  17.         set "z=%%z"
  18.         rem 去除数值中的所有空格
  19.         set "z=!z: =!"
  20.         rem 去除数值中的千分位逗号
  21.         set "z=!z:,=!"

  22.         rem 判断是否为有效数字(过滤光驱、空盘符、无介质驱动器)
  23.         if "!z:~,1!" geq "1" if "!z:~,1!" leq "9" (
  24.             rem 前面补 16 个空格,实现右对齐效果
  25.             set "z=!b!!z!"
  26.             rem 截取最后 16 个字符,格式化输出
  27.             set "z=!z:~-16!"
  28.             rem 输出格式化后的字节数 + 盘符
  29.             echo,!z!字节 %%d
  30.         )
  31.     )
  32. )
  33. :: 退出批处理
  34. exit/b
复制代码

点评

我的 10 PE 也没有反应  详情 回复 发表于 7 天前
阁下再用 ai 解读俺的代码但按照批处语法规范,循环体内的注释行要用 rem 开头,以免运行出现怪错...  详情 回复 发表于 7 天前
回复

使用道具 举报

 楼主| 发表于 7 天前 | 显示全部楼层
a66 发表于 2026-4-22 14:18
自动遍历电脑所有磁盘(C: D: E:…)
    过滤光驱、空盘符、无介质驱动器
    输出纯数字剩余字节数

阁下再用 ai 解读俺的代码但按照批处语法规范,循环体内的注释行要用 rem 开头,以免运行出现怪错...
回复

使用道具 举报

发表于 7 天前 | 显示全部楼层
不错的方案 学习了
回复

使用道具 举报

发表于 7 天前 | 显示全部楼层
难道这样看很麻烦?


2026-04-22_162347.png

点评

这就很清晰了。不必太麻烦。  详情 回复 发表于 6 天前
回复

使用道具 举报

发表于 7 天前 | 显示全部楼层
学习了,谢谢
回复

使用道具 举报

发表于 7 天前 | 显示全部楼层
10 PE 无反应

点评

运行一楼代码之前可先在 cmd 窗口命令行测试 where fsutil.exe 查看其返回值是否为一个真实路径文件名,例如 C:\Windows\System32\fsutil.exe 若是,则运行一楼代码应该没问题。  详情 回复 发表于 7 天前

评分

参与人数 1无忧币 +5 收起 理由
yyz2191958 + 5

查看全部评分

回复

使用道具 举报

发表于 7 天前 | 显示全部楼层
a66 发表于 2026-4-22 14:18
自动遍历电脑所有磁盘(C: D: E:…)
    过滤光驱、空盘符、无介质驱动器
    输出纯数字剩余字节数

我的 10 PE 也没有反应

评分

参与人数 1无忧币 +5 收起 理由
yyz2191958 + 5

查看全部评分

回复

使用道具 举报

 楼主| 发表于 7 天前 | 显示全部楼层

运行一楼代码之前可先在 cmd 窗口命令行测试
   where fsutil.exe
查看其返回值是否为一个真实路径文件名,例如
   C:\Windows\System32\fsutil.exe
若是,则运行一楼代码应该没问题。

点评

Microsoft Windows [版本 10.0.10586] (c) 2016 Microsoft Corporation。保留所有权利。 X:\Windows\System32>where fsutil.exe 'where' 不是内部或外部命令,也不是可运行的程序 或批处理文件。 X:\Windows\Syste  详情 回复 发表于 7 天前
回复

使用道具 举报

发表于 7 天前 | 显示全部楼层
redyear2026 发表于 2026-4-22 19:01
运行一楼代码之前可先在 cmd 窗口命令行测试
   where fsutil.exe
查看其返回值是否为一个真实路径文件名 ...

Microsoft Windows [版本 10.0.10586]
(c) 2016 Microsoft Corporation。保留所有权利。

X:\Windows\System32>where fsutil.exe
'where' 不是内部或外部命令,也不是可运行的程序
或批处理文件。

X:\Windows\System32>

点评

再试试如下这一行代码,也要在命令行上跑 如果当前系统已内置 fsutil.exe,其返回值应为其真实路径文件名,否则,说明你的 pe 系统瘦身够狠!  详情 回复 发表于 7 天前

评分

参与人数 1无忧币 +5 收起 理由
yyz2191958 + 5

查看全部评分

回复

使用道具 举报

发表于 7 天前 来自手机 | 显示全部楼层
高版本这么坑
回复

使用道具 举报

 楼主| 发表于 7 天前 | 显示全部楼层
yyz219195888 发表于 2026-4-22 19:13
Microsoft Windows [版本 10.0.10586]
(c) 2016 Microsoft Corporation。保留所有权利。

再试试如下这一行代码,也要在命令行上跑
  1. for /f %f in ("fsutil.exe") do @echo,%~$path:f
复制代码

如果当前系统已内置 fsutil.exe,其返回值应为其真实路径文件名,否则,说明你的 pe 系统瘦身够狠!

点评

Microsoft Windows [版本 10.0.10586] (c) 2016 Microsoft Corporation。保留所有权利。 X:\Windows\System32>for /f %f in ("fsutil.exe") do @echo,%~$path:f X:\Windows\System32>  详情 回复 发表于 7 天前
回复

使用道具 举报

发表于 7 天前 | 显示全部楼层
redyear2026 发表于 2026-4-22 20:36
再试试如下这一行代码,也要在命令行上跑

如果当前系统已内置 fsutil.exe,其返回值应为其真实路径文件 ...

Microsoft Windows [版本 10.0.10586]
(c) 2016 Microsoft Corporation。保留所有权利。

X:\Windows\System32>for /f %f in ("fsutil.exe") do @echo,%~$path:f


X:\Windows\System32>

点评

一楼代码已更新,可以试试第二版代码。  详情 回复 发表于 6 天前
回复

使用道具 举报

发表于 7 天前 | 显示全部楼层
感谢分享,体验一下有效
回复

使用道具 举报

发表于 7 天前 | 显示全部楼层
  1. if ($args.Count -eq 0) {
  2.     Get-CimInstance Win32_LogicalDisk | Where-Object { $null -ne $_.FreeSpace } | Sort-Object FreeSpace -Descending | ForEach-Object { "{0,16}字节 {1}:" -f $_.FreeSpace, $_.DriveLetter }
  3.     Read-Host
  4.     exit 0
  5. }
  6. Get-CimInstance Win32_LogicalDisk | Where-Object { $null -ne $_.FreeSpace } | ForEach-Object { "{0,16}字节 {1}:" -f $_.FreeSpace, $_.DriveLetter }
复制代码

powershell可以用这个代码
回复

使用道具 举报

 楼主| 发表于 6 天前 | 显示全部楼层
yyz219195888 发表于 2026-4-22 20:39
Microsoft Windows [版本 10.0.10586]
(c) 2016 Microsoft Corporation。保留所有权利。

一楼代码已更新,可以试试第二版代码。

点评

好的 谢谢大神  详情 回复 发表于 6 天前
回复

使用道具 举报

发表于 6 天前 来自手机 | 显示全部楼层
yyz219195888 发表于 2026-4-22 19:13
Microsoft Windows [版本 10.0.10586]
(c) 2016 Microsoft Corporation。保留所有权利。


非常好!!!!!
回复

使用道具 举报

发表于 6 天前 | 显示全部楼层
redyear2026 发表于 2026-4-23 00:31
一楼代码已更新,可以试试第二版代码。

好的 谢谢大神
回复

使用道具 举报

发表于 6 天前 | 显示全部楼层
太好啦,萬分感謝版主的無私發佈分享
回复

使用道具 举报

 楼主| 发表于 6 天前 | 显示全部楼层
本帖最后由 redyear2026 于 2026-4-23 12:42 编辑

如果极端环境下,目标盘区根目录也没有 $RECYCLE.BIN 这个系统隐藏目录,就只能返回 '远古' 之道了,以下这个版本可用于当前系统没有 fsutil,没有 wmic,没有 powershell,也没有预装那些第三方专用工具的...

  1. @echo off &if "%~1"=="" "%~f0" 1|sort /r &pause&exit/b
  2. setlocal enabledelayedexpansion &for /l %%n in (1,1,16) do set "b= !b!"
  3. for /f "tokens=2 delims=\: " %%d in ('reg query HKLM\SYSTEM\MountedDevices^|findstr /i "\\[c-z]:" ') do (
  4.    set "z="
  5.    for /f "tokens=3 delims= " %%z in ('dir /-c %%d:\^|findstr /eric:"[0-9] 可用字节" ') do set "z=%%z"
  6.    if defined z set "z=!b!!z!" &set "z=!z:~-16!" &echo,!z!字节 %%d:) 2>nul
  7. exit/b
复制代码
回复

使用道具 举报

发表于 6 天前 | 显示全部楼层
it323 发表于 2026-4-22 16:27
难道这样看很麻烦?

这就很清晰了。不必太麻烦。
回复

使用道具 举报

发表于 6 天前 | 显示全部楼层
谢谢楼主分享的好方法
回复

使用道具 举报

发表于 6 天前 | 显示全部楼层
感谢分享,很多时候没在意空间大小反倒是下载的时候常因空间不足而退出,这个试试
回复

使用道具 举报

发表于 5 天前 | 显示全部楼层
用字节反而不直观,难道要去数位数

点评

限于批处只能玩32位整数计算,也没有借助外部脚本的大数计算能力,只好用原始字节值了。 非要用批处的拙力鼓捣单位转换(例如转换到 GB 单位),就要忍受其估算的误差了,大约是 5% 吧。 一旦剩余空间小  详情 回复 发表于 5 天前
回复

使用道具 举报

 楼主| 发表于 5 天前 | 显示全部楼层
本帖最后由 redyear2026 于 2026-4-25 10:28 编辑
mrzhonghb 发表于 2026-4-24 21:26
用字节反而不直观,难道要去数位数

  限于批处只能玩32位整数计算,也没有再借助外部脚本(如 vbs/jscript/powershell)的大数计算能力,只好用原始字节值了。
    非要用批处的拙力鼓捣单位转换(例如转换到 GB 单位),就要有估算的误差,现采用 mb 当量估算,误差大约是 5%,若采用 kb 当量估算,误差会在 2~3%,但遭遇大容量盘区剩余空间,估算值会超限失效。
    一旦剩余空间小于1GB,估算值会被被强制为 1GB。

    估算为 GB 单位的版本(用20楼代码修订)
  1. @echo off &if "%~1"=="" "%~f0" 1|sort /r &pause&exit/b
  2. setlocal enabledelayedexpansion &for /l %%n in (1,1,6) do set "b= !b!"
  3. for /f "tokens=2 delims=\: " %%d in ('reg query HKLM\SYSTEM\MountedDevices^|findstr /i "\\[c-z]:" ') do (
  4.    set "z="
  5.    for /f "tokens=3 delims= " %%z in ('dir /-c %%d:\^|findstr /eric:"[0-9] 可用字节" ') do set "z=%%z"
  6.    if defined z (
  7.       set "z=!z:~,-6!" &set/a "z/=1024" &if !z! equ 0 set "z=1"
  8.       set "z=!b!!z!" &set "z=!z:~-6!" &echo,!z!GB %%d:) ) 2>nul
  9. exit/b
复制代码

    估算为 GB 单位的版本(用一楼代码修订)
  1. @echo off &if "%~1"=="" "%~f0" 1|sort /r &pause&exit/b
  2. setlocal enabledelayedexpansion &set "z=" &for /l %%n in (1,1,6) do set "b= !b!"
  3. for /f "delims=" %%D in ('fsutil fsinfo drives') do set "allD=%%D"
  4. for %%d in (%allD:* =%) do (set "z="
  5.    for /f "tokens=2 delims=:(" %%z in ('fsutil volume diskfree %%d') do if not defined z (
  6.       set "z=%%z" &set "z=!z: =!" &set "z=!z:,=!"
  7.       if "!z:~,1!" geq "1" if "!z:~,1!" leq "9" (
  8.          set "z=!z:~,-6!" &set/a "z/=1024" &if !z! equ 0 set "z=1"
  9.          set "z=!b!!z!" &set "z=!z:~-6!" &echo,!z!GB %%d)) )
  10. exit/b
复制代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1|闽公网安备35020302032614号 )

GMT+8, 2026-4-29 14:38

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表