无忧启动论坛

标题: 批处理系列6:查找剩余空间最大的磁盘盘符(终稿) [打印本页]

作者: 青青草    时间: 2021-7-2 11:46
标题: 批处理系列6:查找剩余空间最大的磁盘盘符(终稿)
本帖最后由 青青草 于 2021-7-25 10:48 编辑

现在的硬盘都是大容量,需考虑批处理计算时受到位数的限制,故再次更新如下:

  1. @echo off
  2. setlocal EnableDelayedExpansion
  3. set zero=0000000000000000000000000000000000000000
  4. set size=!zero!1
  5. for /f "tokens=1-3" %%a in ('wmic logicaldisk where "DriveType='3'" get freespace^,name^,size^|find ":"')do (
  6.     for /f "tokens=1,2,3 delims= " %%i in ("%%c") do (
  7. set space=%%a
  8. set free=!zero!!space!
  9. if "!free:~-40!" gtr "!size:~-40!" (
  10. set  size=!free:~-40!
  11. set maxdisk=%%b
  12. set mb=!space!
  13. )
  14. echo 分区%%b   大小:%%c 字节     剩余 !space! 字节
  15. )
  16. )
  17. echo 硬盘剩余最大: 分区 !maxdisk!     剩余: %mb% 字节
  18. pause
复制代码
      利用字符串比较,较好地解决了批处理计算时受位数限制问题,代码较为简洁。位数预设了40位,应该足够了。
      虽然位数预设了40位,足够用了,但总感觉缺点什么;对了,预设40位,还是受到限制,代码不够通用。故修改如下:
  1. @echo off
  2. setlocal EnableDelayedExpansion
  3. set maxn=0
  4. set size=0
  5. for /f "tokens=1-3" %%a in ('wmic logicaldisk where "DriveType='3'" get freespace^,name^,size^|find ":"')do (
  6.         set space=%%a
  7.          call :Length space n
  8.               if !n! gtr !maxn! (
  9.                    set  maxn=!n!
  10.                    set  size=!space!
  11.                    set maxdisk=%%b
  12.                )
  13.               if "!n!" EQU "!maxn!" (
  14.                   if "!space!" gtr "!size!" (
  15.                      set  size=!space!
  16.                      set maxdisk=%%b
  17.                    )               
  18.                )
  19. echo 分区%%b   大小:%%c 字节     剩余 !space! 字节
  20. )
  21. echo 硬盘剩余最大: 分区 !maxdisk!     剩余: %size% 字节
  22. pause

  23. :Length
  24. setlocal enabledelayedexpansion
  25. set "$=!%1!#"
  26. set "len="&for %%a in (4096 2048 1024 256 128 64 32 16 8 4 2 1) do (if "!$:~%%a,1!" NEQ "" set/a len+=%%a&set "$=!$:~%%a!" &if "!$:~1!"=="" goto ok)
  27. set "s=!s!fedcba9876543210" &set/a "len+=0x!s:~16,1!"
  28. :ok
  29. endlocal&set/a "%2=%len%"
  30. goto:eof
复制代码







2021-07-16 (2).png (10.7 KB, 下载次数: 127)

2021-07-16 (2).png

作者: bfgxp    时间: 2021-7-2 12:10
不错,以前一直想要这么一个脚本,虽然后来我用au3实现了。
还是喜欢批处理的直接。
作者: 青青草    时间: 2021-7-2 12:18
bfgxp 发表于 2021-7-2 12:10
不错,以前一直想要这么一个脚本,虽然后来我用au3实现了。
还是喜欢批处理的直接。


作者: ESD    时间: 2021-7-2 17:05
这个代码连setlocal ENABLEDELAYEDEXPANSION都没有加上,你发出来作甚呢?
作者: 江南一根葱    时间: 2021-7-3 23:57
貌似不行啊,网上找到的其它批处理也不行
作者: 江南一根葱    时间: 2021-7-4 00:08
  1. echo off
  2. set /a max=0
  3. setlocal EnableDelayedExpansion
  4. title 各分区剩余空间情况
  5. echo.
  6. echo.
  7. echo 磁盘分区 磁盘卷标名 剩余空间(MB)
  8. echo _____________________________________________________
  9. for %%d in (C D E F G H I J K L M N O P Q R S T U V W Z) do (
  10. if exist %%d:\nul (
  11. for /f "tokens=3" %%z in ('dir /-c %%d:\') do set freesize=%%z
  12. set /a freesize=!freesize:~0,-3!/1073>nul
  13. set freesiz=!freesize!
  14. set /a freesize=!freesiz:~-9!
  15. if !freesize! gtr !max! set max=!freesize!&&set maxdisk=%%d:
  16. for /f "tokens=3*" %%v in ('vol %%d:') do set volume=%%w
  17. set volume=!volume!
  18. set volume=!volume:~-20!
  19. echo %%d: !volume! !freesize!
  20. )
  21. )
  22. @echo 剩余空间最大的盘符为%maxdisk% ,  可映射为I盘
  23. pause
复制代码
抄了个,可以


作者: 青青草    时间: 2021-7-4 14:59
江南一根葱 发表于 2021-7-4 00:08
抄了个,可以

剩余空间的大小显示不准确。
作者: 青青草    时间: 2021-7-4 18:11
bfgxp 发表于 2021-7-2 12:10
不错,以前一直想要这么一个脚本,虽然后来我用au3实现了。
还是喜欢批处理的直接。

已更新,显示剩余空间容量更精确!
作者: 青青草    时间: 2021-7-5 09:45
ESD 发表于 2021-7-2 17:05
这个代码连setlocal ENABLEDELAYEDEXPANSION都没有加上,你发出来作甚呢?

这么简单的事情,谁不会?自己加上不就得了。
作者: 610644034    时间: 2021-7-5 21:03
批处理实现起来没有压力啊!

捕获.PNG (72.71 KB, 下载次数: 106)

捕获.PNG

作者: 青青草    时间: 2021-7-5 21:23
610644034 发表于 2021-7-5 21:03
批处理实现起来没有压力啊!


作者: dos时代菜鸟    时间: 2021-7-11 11:01
本帖最后由 dos时代菜鸟 于 2021-7-11 11:37 编辑
  1. @echo off
  2. setlocal  ENABLEDELAYEDEXPANSION
  3. set bit=0
  4. set free1=0
  5. set free2=0
  6. set n=0
  7. echo 找出剩余空间最大的那个分区对应的盘符
  8. echo --------------------------------------
  9. for /f  "skip=1 delims=" %%c in (' wmic volume get DriveLetter^,freespace^,Label') do (
  10.     for /f "tokens=1,2,3* delims= " %%i in ("%%c") do (
  11.         if not "%%k"=="" (

  12.             rem 计算当前 Freespace 数值位数
  13.             call:x_bit %%j
  14.             
  15.             set free=%%j
  16.             rem 因为 cmd 只能计算10位数 且小于 2147483647 ,所以先截取 数值后9位,存入Free22
  17.             rem 再截取前面剩下的,如果 当前位数不足9,设置0
  18.             set free22=!free:~-9!
  19.             if !bit1! gtr 9 (set free11=!free:~0,-9!) else (set free11=0)
  20.             
  21.             rem 如果当前 Freespace 数值位数比之前的大,就进一步比较
  22.             if !bit1! geq !bit! (
  23.                 set bit=!bit1!
  24.         
  25.                 rem 分两段比较 Free1 free2 确定当前 是否为最大。
  26.                 if !free11! geq !free1! (
  27.                     if !free11! gtr !free1!  set free2=!free22!
  28.                     set free1=!free11!
  29.                     if !free22! geq !free2! (
  30.                         set free2=!free22!
  31.                         set drv=%%i
  32.                         set /a n=n+1
  33.                     )
  34.                 )
  35.             )
  36.             if "!drv!"=="%%i" (echo %%i    !free11!,!free22!    *!n!    %%k) else (echo %%i    !free11!,!free22!        %%k)
  37.         )
  38.     )
  39. )
  40. echo -----------------------------------
  41. if not "!drv!"=="" ( echo MAX_FREE_DRV=!drv!      !free1!!free2!  ) ELSE (echo 没有可用分区!)
  42. pause
  43. goto :eof

  44. :x_bit
  45. rem 用于计算传递过来的 字符串参数 的字符个数。 返回变量 bit1
  46.     set "str1=%1"
  47.     for /l %%r in (0,1,18) do (
  48.         if not "!str1:~%%r,1!"=="" (
  49.             set  bit1=%%r
  50.         )
  51.     )
  52. exit /b
复制代码

引入一个计算数值位数的 办法。用 wimc 获取分区剩余大小,然后比较出来。
预设数值最大 18位,而 cmd 只能计算10位数 且要小于 2147483647,那就 截取下呗。
仅做技术交流,运行效率 不是最好的,但算法 是最传统的。







作者: lpsyuntao    时间: 2021-7-11 18:24
感谢分享
作者: plusv    时间: 2021-7-12 14:56
dos时代菜鸟 发表于 2021-7-11 11:01
引入一个计算数值位数的 办法。用 wimc 获取分区剩余大小,然后比较出来。
预设数值最大 18位,而 cmd  ...

>而 cmd 只能计算10位数 且要小于 2147483647
准确的说是 32 位有号整数
Int=     -2147483648(80000000) 到 2147483647(7FFFFFFF)


MS OS 从 Vista 就已进入 64 位,
而 CMD Console 只能支持到32 位有号整数,
已是千年老问题,
MS 都不修.







作者: dos时代菜鸟    时间: 2021-7-13 12:17
本帖最后由 dos时代菜鸟 于 2021-7-13 12:21 编辑
plusv 发表于 2021-7-12 14:56
>而 cmd 只能计算10位数 且要小于 2147483647
准确的说是 32 位有号整数
Int=     -2147483648(8000000 ...

if !bit1! gtr 9 (set free11=!free:~0,-9!) else (set free11=0)

改成
if !bit1! geq 9 (set free11=!free:~0,-9!) else (set free11=0)

  1. @echo off
  2. setlocal  ENABLEDELAYEDEXPANSION
  3. set bit=0
  4. set free1=0
  5. set free2=0
  6. set n=0
  7. echo 找出剩余空间最大的那个分区对应的盘符
  8. echo --------------------------------------
  9. for /f  "skip=1 delims=" %%c in (' wmic volume get DriveLetter^,freespace^,Label') do (

  10.     for /f "tokens=1,2,3* delims= " %%i in ("%%c") do (
  11.         if not "%%k"=="" (

  12.             rem 计算当前 Freespace 数值位数
  13.             call:x_bit %%j
  14.             
  15.             set free=%%j
  16.             rem 因为 cmd 只能计算10位数 且小于 2147483647 ,所以先截取 数值后9位,存入Free22
  17.             rem 再截取前面剩下的,如果 当前位数不足9,设置0
  18.             set free22=!free:~-9!
  19.             if !bit1! geq 9 (set free11=!free:~0,-9!) else (set free11=0)
  20.             
  21.             rem 如果当前 Freespace 数值位数比之前的大,就进一步比较
  22.             if !bit1! geq !bit! (
  23.                 set bit=!bit1!
  24.         
  25.                 rem 分两段比较 Free1 free2 确定当前 是否为最大。
  26.                 if !free11! geq !free1! (
  27.                     if !free11! gtr !free1!  set free2=!free22!
  28.                     set free1=!free11!
  29.                     if !free22! geq !free2! (
  30.                         set free2=!free22!
  31.                         set drv=%%i
  32.                         set /a n=n+1
  33.                     )
  34.                 )
  35.             )
  36.             if "!drv!"=="%%i" (echo %%i    !free11!,!free22!    *!n!    %%k) else (echo %%i    !free11!,!free22!        %%k)
  37.         )
  38.     )
  39. )
  40. echo -----------------------------------
  41. if not "!drv!"=="" ( echo MAX_FREE_DRV=!drv!      !free1!!free2!  ) ELSE (echo 没有可用分区!)
  42. pause
  43. goto :eof

  44. :x_bit
  45. rem 用于计算传递过来的 字符串参数 的字符个数。 返回变量 bit1
  46.     set "str1=%1"
  47.     for /l %%r in (0,1,18) do (
  48.         if not "!str1:~%%r,1!"=="" (
  49.             set  bit1=%%r
  50.         )
  51.     )
  52. exit /b
复制代码




作者: plusv    时间: 2021-7-13 12:29
dos时代菜鸟 发表于 2021-7-13 12:17
if !bit1! gtr 9 (set free11=!free:~0,-9!) else (set free11=0)

改成

于 Windows 7 X64 测试通过.



作者: nttwqz    时间: 2021-7-13 13:47
plusv 发表于 2021-7-12 14:56
>而 cmd 只能计算10位数 且要小于 2147483647
准确的说是 32 位有号整数
Int=     -2147483648(8000000 ...

从7的默认cmd到8.1的资管管理器默认cmd和ps,到10的默认ps以及右键默认ps,MS在越来越激进的推荐PS,cmd能不放弃就不错了,我估计绝大部分代码几十年都没动过,更别提改进了,深入研究下,连特么diskpart都一大堆bug。跟分裂的UI一样,10都出来多少年了,依然十分分裂
作者: plusv    时间: 2021-7-13 14:35
nttwqz 发表于 2021-7-13 13:47
从7的默认cmd到8.1的资管管理器默认cmd和ps,到10的默认ps以及右键默认ps,MS在越来越激进的推荐PS,cmd ...

MS 很早以前就推 PowerShell 取代 BAT,
我会 C# 所以使用 PowerShell 也没什么难度,
PowerShell 是比较强大没错,
但实际上我不常使用 PowerShell.

原因:
1. PowerShell 依赖 .Net Framework,所以很不通用各 OS.
2. PowerShell 在老机器(我老 PC 12 年)第一次运行约 3-5 秒,很慢.
3. Windows PE 通常没有 .Net Framework/PowerShell.
4. .Net Framework 有版本要求,就像 DLL Hell 一样.

通常:
1. 优先使用 BAT.
2. 功能不足/效率差的就找网上现有的第三方 CMD Console 小程序.
3. 没合适的就自写 CMD Console 小程序.
4. 最后才会使用 PowerShell.

至于 UI,
MS UI 真是越做越丑.

个人认为的经典
DOS : DOS 6.22
Win9x : Windows 98 第二版
WinNT : Windows XP/Windows 7(使用中,目前使用 12 年)



作者: 807979023    时间: 2021-7-13 21:19
本帖最后由 807979023 于 2021-7-13 21:34 编辑

转自批处理之家apang大师作品。
加了一句判断,多数代码看不懂,剩余空间的大小显示准确。

  1. @echo off&color 1f&echo.
  2. setlocal ENABLEDELAYEDEXPANSION
  3. for /f "delims=g" %%a in ('cmd /u /c Echo,有') do set "Tab=%%a"
  4. set w=wmic logicaldisk where "DriveType='3'"
  5. set /a max=1
  6. for /f "tokens=1-3" %%a in ('%w% get freespace^,name^,size^|find ":"')do (
  7.   set /p=分区%%b%Tab%<nul
  8.   call :GetSize %%a000 free
  9.   call :GetSize %%c000 size
  10.   set /a used=size-free
  11.   if !size! gtr 102400 (
  12.     set "G=GB" & set /a size/=1024,used/=1024
  13.   ) else set "G=MB"
  14.   set /a used=1000*used/size
  15.   if "!used:~,-1!" == "" set "used=0!used!"
  16.   set /p=大小: !size:~,-2!.!size:~-2!!G!%Tab%<nul
  17.   set free1=!free!
  18.   if !free! gtr 102400 (set /a free/=1024 & set "G=GB") else set "G=MB"
  19.   set /p=剩余: !free:~,-2!.!free:~-2!!G!%Tab%<nul
  20.   set /p=使用率: !used:~,-1!.!used:~-1!%%<nul & echo,
  21.   if !free1! gtr !max! set max=!free1!&&set mb=!free:~,-2!.!free:~-2!!G!&&set bc=%%b
  22. )
  23. echo.&echo 硬盘剩余最大: 分区%bc%    剩余: %mb%
  24. echo.&echo 按任意键退出...&pause >nul&exit

  25. :GetSize
  26. set "num=%1" & set "n=" & set "%2="
  27. for %%a in (16 8 4 2 1) do (
  28.   if not "!num:~%%a!"=="" set /a n+=%%a & set "num=!num:~%%a!"
  29. )
  30. set "num=%1" & set /a n-=6
  31. for /l %%a in (!n! -1 1) do (
  32.   set "s=!num:~,-%%a!"
  33.   if "!s:~,1!" == "0" set "s=!s:~1!"
  34.   set /a m=s%%1048576,s/=1048576
  35.   set "%2=!%2!!s!"
  36.   set "num=!m!!num:~-%%a!"
  37. )
  38. if not defined %2 (
  39.   set "%2=!num:~,-1!"
  40. ) else if "!%2:~,1!" == "0" set "%2=!%2:~1!"
  41. goto :EOF
复制代码


1.jpg (60.51 KB, 下载次数: 102)

1.jpg

作者: plusv    时间: 2021-7-13 23:03
807979023 发表于 2021-7-13 21:19
转自批处理之家apang大师作品。
加了一句判断,多数代码看不懂,剩余空间的大小显示准确。

于 Windows 7 X64 测试通过.




作者: 807979023    时间: 2021-7-14 10:06
plusv 发表于 2021-7-13 23:03
于 Windows 7 X64 测试通过.

请问格式和卷名是怎么加的呀!
作者: 807979023    时间: 2021-7-14 10:07
本帖最后由 807979023 于 2021-7-14 10:08 编辑
plusv 发表于 2021-7-13 23:03
于 Windows 7 X64 测试通过.


作者: nttwqz    时间: 2021-7-14 14:30
dfp /drives /b
貌似是8.1系统独有命令,复制到10下可用
作者: plusv    时间: 2021-7-14 20:55
807979023 发表于 2021-7-14 10:06
请问格式和卷名是怎么加的呀!

将 FileSystem,VolumeName 加到 For
作者: 807979023    时间: 2021-7-15 13:30
加格式和卷名后,xp  win7x32  win7x64 测试通过,win10x64失败。
作者: plusv    时间: 2021-7-15 18:28
807979023 发表于 2021-7-15 13:30
加格式和卷名后,xp  win7x32  win7x64 测试通过,win10x64失败。

807979023> 加格式和卷名后,xp  win7x32  win7x64 测试通过,win10x64失败。

我于 Windows XP/Windows 7 X64/Windows 10 X64 都没问题.

=================================================

另外:
我于 Windows XP/Windows 7 X64/Windows 10 X64

1.bat --> 19F 807979023
2.bat --> 12F dos时代菜鸟
3.bat --> 6F 江南一根葱

只有 2.bat --> 12F dos时代菜鸟 由于 Windows XP 不支持 wmic volume,
其它全部都没问题.









作者: 807979023    时间: 2021-7-15 19:27
plusv 发表于 2021-7-15 18:28
807979023> 加格式和卷名后,xp  win7x32  win7x64 测试通过,win10x64失败。

我于 Windows XP/Window ...

哪里改错了?
  1. @echo off&color 1f&echo.
  2. setlocal ENABLEDELAYEDEXPANSION
  3. for /f "delims=g" %%a in ('cmd /u /c Echo,有') do set "Tab=%%a"
  4. set w=wmic logicaldisk where "DriveType='3'"
  5. set /a max=1
  6. for /f "tokens=1-5" %%a in ('%w% get FileSystem^,freespace^,name^,size^,VolumeName^|find ":"')do (
  7.   set /p=分区%%c%Tab%<nul
  8.   call :GetSize %%b000 free
  9.   call :GetSize %%d000 size
  10.   set /a used=size-free
  11.   if !size! gtr 102400 (
  12.     set "G=GB" & set /a size/=1024,used/=1024
  13.   ) else set "G=MB"
  14.   set /a used=1000*used/size
  15.   if "!used:~,-1!" == "" set "used=0!used!"
  16.   set /p=大小: !size:~,-2!.!size:~-2!!G!%Tab%<nul
  17.   set free1=!free!
  18.   if !free! gtr 102400 (set /a free/=1024 & set "G=GB") else set "G=MB"
  19.   set /p=剩余: !free:~,-2!.!free:~-2!!G!%Tab%<nul
  20.   set /p=使用率: !used:~,-1!.!used:~-1!%%%Tab%<nul
  21.   set /p=卷标: %%e%Tab%<nul
  22.   set /p=格式: %%a%Tab%<nul & echo,
  23.   if !free1! gtr !max! set max=!free1!&&set mb=!free:~,-2!.!free:~-2!!G!&&set bc=%%c
  24. )
  25. echo.&echo 分区剩余最大: 分区%bc%    剩余: %mb%
  26. echo.&echo 按任意键退出...&pause >nul&exit

  27. :GetSize
  28. set "num=%1" & set "n=" & set "%2="
  29. for %%a in (16 8 4 2 1) do (
  30.   if not "!num:~%%a!"=="" set /a n+=%%a & set "num=!num:~%%a!"
  31. )
  32. set "num=%1" & set /a n-=6
  33. for /l %%a in (!n! -1 1) do (
  34.   set "s=!num:~,-%%a!"
  35.   if "!s:~,1!" == "0" set "s=!s:~1!"
  36.   set /a m=s%%1048576,s/=1048576
  37.   set "%2=!%2!!s!"
  38.   set "num=!m!!num:~-%%a!"
  39. )
  40. if not defined %2 (
  41.   set "%2=!num:~,-1!"
  42. ) else if "!%2:~,1!" == "0" set "%2=!%2:~1!"
  43. goto :EOF
复制代码

作者: 青青草    时间: 2021-7-15 20:21
plusv 发表于 2021-7-15 18:28
807979023> 加格式和卷名后,xp  win7x32  win7x64 测试通过,win10x64失败。

我于 Windows XP/Window ...

已再次更新代码,麻烦你测试一下。
谢谢!
作者: plusv    时间: 2021-7-16 01:41
本帖最后由 plusv 于 2021-7-16 01:47 编辑
807979023 发表于 2021-7-15 19:27
哪里改错了?

我 12 年老 PC,
Windows 7 X64 : 主系统.
Windows XP(在 VMWare 中) : 测试软件.
Windows 10 PE(在 VMWare 中) : 测试软件.
Windows 10 (一台小 NoteBook 中) : 没什么在用,一个月开机一次.

批处理在 Windows XP/Windows 7 X64 测试正常,
下午于 Windows 10 (一台小 NoteBook 中) 测试完 26F 文后就收起来了
试了两个 Windows 10 PE(在 VMWare 中)无 WMIC,所以无法测试.











作者: plusv    时间: 2021-7-16 01:45
青青草 发表于 2021-7-15 20:21
已再次更新代码,麻烦你测试一下。
谢谢!

我 12 年老 PC,
Windows 7 X64 : 主系统.
Windows XP(在 VMWare 中) : 测试软件.
Windows 10 PE(在 VMWare 中) : 测试软件.
Windows 10 (一台小 NoteBook 中) : 没什么在用,一个月开机一次.

批处理在 Windows XP/Windows 7 X64 测试正常,
下午于 Windows 10 (一台小 NoteBook 中) 测试完 26F 文后就收起来了
试了两个 Windows 10 PE(在 VMWare 中)无 WMIC,所以无法测试.







作者: 807979023    时间: 2021-7-16 09:10
青青草 发表于 2021-7-15 20:21
已再次更新代码,麻烦你测试一下。
谢谢!

测试通过,由于截图保存在e盘,所以e盘剩余字节依次减少。
c盘是win7x32,win7x64安装后放在c盘一个文件夹中,需要时与根目录系统交换位置。
d盘是winxp,h盘是win10x64,启动后盘符为c,原c盘被隐藏。
所以都是同一硬盘实机测试。

2.jpg (198.52 KB, 下载次数: 115)

2.jpg

作者: junyee    时间: 2021-7-16 09:45
同是脚本语言和 bash 一比,cmd.exe 就是弱鸡。

ps 学习成本略高,而且老系统不一定有,版本多,有不兼容现象。

作者: dos时代菜鸟    时间: 2021-7-16 09:47
再来个 fsutil 的
  1. @echo off
  2. setlocal  ENABLEDELAYEDEXPANSION
  3. for /f "delims=" %%c in ('fsutil fsinfo drives') do (call :x_drv %%c)
  4. pause
  5. goto :eof

  6. :x_bit
  7. rem 用于计算传递过来的 字符串参数 的字符个数。 返回变量 bit1
  8.     set "str1=%1"
  9.     for /l %%r in (0,1,18) do (
  10.         if not "!str1:~%%r,1!"=="" (
  11.             set  bit1=%%r
  12.         )
  13.     )
  14. exit /b

  15. :x_drv
  16.         set bit=0
  17.         set free1=0
  18.         set free2=0
  19.         :loop1
  20.                 shift
  21.                 if exist %1 (
  22.                         set /a n=0
  23.                         for /f "tokens=2 delims=#:^(" %%j in ('fsutil volume diskfree %1') do (
  24.                                 set /a n=!n!+1
  25.                                 if !n! equ 1 (
  26.                                         call:x_bit %%j
  27.                                         set free=%%j
  28.                                         set free=!free: =!
  29.                                         set free22=!free:~-9!
  30.                                         if !bit1! geq 9 (set free11=!free:~0,-9!) else (set free11=0)
  31.                                         if !bit1! geq !bit! (
  32.                                                 set bit=!bit1!
  33.                                                 if !free11! geq !free1! (
  34.                                                         if !free11! gtr !free1! set free2=!free22!
  35.                                                         set free1=!free11!
  36.                                                         if !free22! geq !free2! (
  37.                                                                 set free2=!free22!
  38.                                                                 set drv=%1
  39.                                                         )
  40.                                                 )
  41.                                         )
  42.                                         if "!drv!"=="%1" ( echo %1 !free11!,!free22!        *) else (echo %1 !free11!,!free22!)
  43.                                 )
  44.                         )
  45.                 )
  46.         if not "%2"=="" goto loop1
  47.         echo.
  48.         echo !drv! !free1!!free2!
  49. exit /b
复制代码

作者: 青青草    时间: 2021-7-16 10:31
nttwqz 发表于 2021-7-14 14:30
dfp /drives /b
貌似是8.1系统独有命令,复制到10下可用

谢谢!
作者: 青青草    时间: 2021-7-16 10:36
plusv 发表于 2021-7-16 01:45
我 12 年老 PC,
Windows 7 X64 : 主系统.
Windows XP(在 VMWare 中) : 测试软件.

谢谢!
在我的系统Windows 10和Windows10PE中测试也均正常。
作者: 青青草    时间: 2021-7-16 10:37
本帖最后由 青青草 于 2021-7-16 10:39 编辑
807979023 发表于 2021-7-16 09:10
测试通过,由于截图保存在e盘,所以e盘剩余字节依次减少。
c盘是win7x32,win7x64安装后放在c盘一个文件 ...

谢谢!利用字符串比较,解决了位数限制问题,代码较为简洁。

作者: 青青草    时间: 2021-7-16 10:40
junyee 发表于 2021-7-16 09:45
同是脚本语言和 bash 一比,cmd.exe 就是弱鸡。

ps 学习成本略高,而且老系统不一定有,版本多,有不兼 ...


作者: 青青草    时间: 2021-7-16 10:40
dos时代菜鸟 发表于 2021-7-16 09:47
再来个 fsutil 的


作者: 青青草    时间: 2021-7-16 10:41
vvt1321 发表于 2021-7-16 10:16
在看


作者: dos时代菜鸟    时间: 2021-7-16 10:43
本帖最后由 dos时代菜鸟 于 2021-7-16 10:45 编辑

free.7z (816 Bytes, 下载次数: 7)




用 fsutil  获取 盘符列表,分区格式 卷标 分区类型,如果 找不出 分区格式 就认为不是本地盘可能是网盘或者光盘,不在统计之列。


作者: plusv    时间: 2021-7-16 10:55
本帖最后由 plusv 于 2021-7-16 12:37 编辑
dos时代菜鸟 发表于 2021-7-16 10:43
用 fsutil  获取 盘符列表,分区格式 卷标 分区类型,如果 找不出 分区格式 就认为不是本地盘可 ...

在我 12 年老 PC 测试.

1.fsutil 效率慢一点.
2. D: T: 格式会跑掉,不对齐.
3. 本地硬盘 G: FAT 没列出.

PS:
C:\>fsutil volume diskfree g:
FSUTIL 公用程式需要本机 NTFS 磁碟区。







作者: junyee    时间: 2021-7-16 12:29
dos时代菜鸟 发表于 2021-7-16 10:43
用 fsutil  获取 盘符列表,分区格式 卷标 分区类型,如果 找不出 分区格式 就认为不是本地盘可 ...

fsutil 不支持 FAT ,以及某些设备的分区。。
作者: dos时代菜鸟    时间: 2021-7-16 13:35
嗯嗯 fsutil 也有不足,不过,
找最大剩余,估计 fat 分区里面 是不够的。
作者: dos时代菜鸟    时间: 2021-7-16 20:33
free-1.7z (872 Bytes, 下载次数: 6)
用 fsutil 肯定不支持 fat ,另外 为了 获取 卷标,分区格式,介质类型 等信息,必然要多次运行 fsutil ,效率会慢一些,
有的系统下 有 逗号 分割 尺寸大小,还需要 对文本流进行格式统一,效率也会慢一些。

遗憾的是,目前看 ,这个功能 不管怎样 最终 都需要用 外部命令来完成 wmic /fsutil 都属于 外部命令,如果用 内部命令,也就 dir 了,但是有 有 中英文的问题,不够通用。





作者: plusv    时间: 2021-7-16 21:07
dos时代菜鸟 发表于 2021-7-16 20:33
用 fsutil 肯定不支持 fat ,另外 为了 获取 卷标,分区格式,介质类型 等信息,必然要多次运行 fsutil , ...

于 Windows 7 X64 测试通过.

41F 格式会跑掉,不对齐问题,我已自行修正,
我是比较喜欢 41F,因为刚好能塞满 80x25 CMD Console.

综合全楼,
1. OS 兼容性(Windows XP/Windows 7 X64/Windows 10 X64).
2. 运行效率.
3. 多功能性.

19F 807979023 的批处理是首选.





作者: dos时代菜鸟    时间: 2021-7-16 21:13
本帖最后由 dos时代菜鸟 于 2021-7-16 21:24 编辑

这是用 dir 获取磁盘剩余空间 用的。不需要外部程序,不需要 find

free-2.7z (613 Bytes, 下载次数: 14)





作者: 鲧尧    时间: 2021-7-20 09:43
感谢分享
作者: chenfine    时间: 2021-7-20 13:45
学习
作者: nianyueriPE    时间: 2021-7-24 15:30
挺好用的,正需要。
作者: 青青草    时间: 2021-7-25 10:53
鲧尧 发表于 2021-7-20 09:43
感谢分享

已更新!
作者: 青青草    时间: 2021-7-25 10:54
chenfine 发表于 2021-7-20 13:45
学习

已更新!
作者: 青青草    时间: 2021-7-25 10:54
nianyueriPE 发表于 2021-7-24 15:30
挺好用的,正需要。

已更新!
作者: 创新科技2015    时间: 2023-11-4 19:02

感谢分享
作者: 2012飘水    时间: 2024-4-9 21:11
学习了,感谢分享
作者: pda8888    时间: 2024-4-10 22:24
只找最大剩余空间的盘符,只用dir /-c 矣。
思路:
1、获得 C-Z盘的剩余空间 ,得到一个数组freespace[0].drive、freespace[0].freesize、freespace[1].drive、freespace[1].freesize……freespace[n].drive、freespace[n].freesize,其中,freespace[n].freesize根据其长度,前导补0,使得每个freespace[n].freesize的长度相同,比如:40位。
2、利用set 命令排序,见:http://bbs.wuyou.net/forum.php?mod=viewthread&tid=437821
  1. 运行下面批处理:
  2. @echo off&setlocal enabledelayedexpansion
  3. for /l %%i in (1,1,4) do set "kong=!kong!#"
  4. for /f "tokens=1,2 delims=." %%i in (11.txt) do (
  5. set p=%%i
  6. set "str=!p!%kong%"
  7. call set "a=!str:~,4!"
  8. call set "a=%%a:!p!=%%"
  9. if not "%%j"=="" (set "_!a!!p!.%%j=a") else set "_!a!!p!=a"
  10. )
  11. echo.
  12. echo.
  13. for /f "delims==_" %%i in ('set _') do (
  14. set "str=%%i"
  15. echo !str:#=!
  16. )
  17. pause>nul
复制代码

作者: 文三快    时间: 2024-4-11 13:25
来看看怎么样




欢迎光临 无忧启动论坛 (http://bbs.c3.wuyou.net/) Powered by Discuz! X3.3