无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站广告联系 微信:wuyouceo QQ:184822951
查看: 10277|回复: 54
打印 上一主题 下一主题

批处理系列6:查找剩余空间最大的磁盘盘符(终稿)

    [复制链接]
1#
发表于 2021-7-11 11:01:27 | 显示全部楼层
本帖最后由 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,那就 截取下呗。
仅做技术交流,运行效率 不是最好的,但算法 是最传统的。






点评

>而 cmd 只能计算10位数 且要小于 2147483647 准确的说是 32 位有号整数 Int= -2147483648(80000000) 到 2147483647(7FFFFFFF) MS OS 从 Vista 就已进入 64 位, 而 CMD Console 只能支持到32 位有号整数  详情 回复 发表于 2021-7-12 14:56
回复

使用道具 举报

2#
发表于 2021-7-13 12:17:19 | 显示全部楼层
本帖最后由 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
复制代码



点评

于 Windows 7 X64 测试通过. [attachimg]483314[/attachimg]  详情 回复 发表于 2021-7-13 12:29
回复

使用道具 举报

3#
发表于 2021-7-16 09:47:55 | 显示全部楼层
再来个 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
复制代码
回复

使用道具 举报

4#
发表于 2021-7-16 10:43:06 | 显示全部楼层
本帖最后由 dos时代菜鸟 于 2021-7-16 10:45 编辑

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




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

点评

fsutil 不支持 FAT ,以及某些设备的分区。。  详情 回复 发表于 2021-7-16 12:29
在我 12 年老 PC 测试. 1.fsutil 效率慢一点. 2. D: T: 格式会跑掉,不对齐. [attachimg]483487[/attachimg]  详情 回复 发表于 2021-7-16 10:55
回复

使用道具 举报

5#
发表于 2021-7-16 13:35:22 | 显示全部楼层
嗯嗯 fsutil 也有不足,不过,
找最大剩余,估计 fat 分区里面 是不够的。
回复

使用道具 举报

6#
发表于 2021-7-16 20:33:35 | 显示全部楼层
free-1.7z (872 Bytes, 下载次数: 6)
用 fsutil 肯定不支持 fat ,另外 为了 获取 卷标,分区格式,介质类型 等信息,必然要多次运行 fsutil ,效率会慢一些,
有的系统下 有 逗号 分割 尺寸大小,还需要 对文本流进行格式统一,效率也会慢一些。

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




点评

于 Windows 7 X64 测试通过. 41F 格式会跑掉,不对齐问题,我已自行修正, 我是比较喜欢 41F,因为刚好能塞满 80x25 CMD Console. 综合全楼, 1. OS 兼容性(Windows XP/Windows 7 X64/Windows 10 X64). 2. 运行  详情 回复 发表于 2021-7-16 21:07
回复

使用道具 举报

7#
发表于 2021-7-16 21:13:27 | 显示全部楼层
本帖最后由 dos时代菜鸟 于 2021-7-16 21:24 编辑

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

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




回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-5-15 22:29

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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