无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站广告联系 微信:wuyouceo QQ:184822951
12
返回列表 发新帖
楼主: 青青草
打印 上一主题 下一主题

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

    [复制链接]
31#
发表于 2021-7-16 09:10:04 | 只看该作者
青青草 发表于 2021-7-15 20:21
已再次更新代码,麻烦你测试一下。
谢谢!

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

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

2.jpg

点评

谢谢!  详情 回复 发表于 2021-7-16 10:37
回复

使用道具 举报

32#
发表于 2021-7-16 09:45:12 | 只看该作者
同是脚本语言和 bash 一比,cmd.exe 就是弱鸡。

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

使用道具 举报

33#
发表于 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
复制代码
回复

使用道具 举报

34#
 楼主| 发表于 2021-7-16 10:31:39 | 只看该作者
nttwqz 发表于 2021-7-14 14:30
dfp /drives /b
貌似是8.1系统独有命令,复制到10下可用

谢谢!
回复

使用道具 举报

35#
 楼主| 发表于 2021-7-16 10:36:28 | 只看该作者
plusv 发表于 2021-7-16 01:45
我 12 年老 PC,
Windows 7 X64 : 主系统.
Windows XP(在 VMWare 中) : 测试软件.

谢谢!
在我的系统Windows 10和Windows10PE中测试也均正常。
回复

使用道具 举报

36#
 楼主| 发表于 2021-7-16 10:37:40 | 只看该作者
本帖最后由 青青草 于 2021-7-16 10:39 编辑
807979023 发表于 2021-7-16 09:10
测试通过,由于截图保存在e盘,所以e盘剩余字节依次减少。
c盘是win7x32,win7x64安装后放在c盘一个文件 ...

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

使用道具 举报

37#
 楼主| 发表于 2021-7-16 10:40:10 | 只看该作者
junyee 发表于 2021-7-16 09:45
同是脚本语言和 bash 一比,cmd.exe 就是弱鸡。

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

回复

使用道具 举报

38#
 楼主| 发表于 2021-7-16 10:40:34 | 只看该作者
回复

使用道具 举报

39#
 楼主| 发表于 2021-7-16 10:41:15 | 只看该作者
回复

使用道具 举报

40#
发表于 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
回复

使用道具 举报

41#
发表于 2021-7-16 10:55:01 | 只看该作者
本帖最后由 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 磁碟区。






回复

使用道具 举报

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

fsutil 不支持 FAT ,以及某些设备的分区。。
回复

使用道具 举报

43#
发表于 2021-7-16 13:35:22 | 只看该作者
嗯嗯 fsutil 也有不足,不过,
找最大剩余,估计 fat 分区里面 是不够的。
回复

使用道具 举报

44#
发表于 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
回复

使用道具 举报

45#
发表于 2021-7-16 21:07:58 | 只看该作者
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 的批处理是首选.




回复

使用道具 举报

46#
发表于 2021-7-16 21:13:27 | 只看该作者
本帖最后由 dos时代菜鸟 于 2021-7-16 21:24 编辑

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

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




回复

使用道具 举报

47#
发表于 2021-7-20 09:43:48 | 只看该作者
感谢分享

点评

已更新!  详情 回复 发表于 2021-7-25 10:53
回复

使用道具 举报

48#
发表于 2021-7-20 13:45:55 | 只看该作者
学习

点评

已更新!  详情 回复 发表于 2021-7-25 10:54
回复

使用道具 举报

49#
发表于 2021-7-24 15:30:22 | 只看该作者
挺好用的,正需要。

点评

已更新!  详情 回复 发表于 2021-7-25 10:54
回复

使用道具 举报

50#
 楼主| 发表于 2021-7-25 10:53:35 | 只看该作者

已更新!
回复

使用道具 举报

51#
 楼主| 发表于 2021-7-25 10:54:05 | 只看该作者
回复

使用道具 举报

52#
 楼主| 发表于 2021-7-25 10:54:16 | 只看该作者
nianyueriPE 发表于 2021-7-24 15:30
挺好用的,正需要。

已更新!
回复

使用道具 举报

53#
发表于 2023-11-4 19:02:32 | 只看该作者

感谢分享
回复

使用道具 举报

54#
发表于 2024-4-9 21:11:56 | 只看该作者
学习了,感谢分享
回复

使用道具 举报

55#
发表于 2024-4-10 22:24:04 | 只看该作者
只找最大剩余空间的盘符,只用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
复制代码
回复

使用道具 举报

56#
发表于 2024-4-11 13:25:32 | 只看该作者
来看看怎么样
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-4-24 10:34

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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