无忧启动论坛

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

准确判断本机有多少个硬盘和分区

  [复制链接]
跳转到指定楼层
1#
发表于 2022-8-21 20:56:47 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
提示: 作者被禁止或删除 内容自动屏蔽
2#
发表于 2022-8-21 21:29:37 | 只看该作者
感谢分享 试了下很准确
回复

使用道具 举报

3#
发表于 2022-8-22 08:33:03 | 只看该作者
diskpart 可以接收 管道传递指令
比如 : cmd 下输入
echo  list disk | diskpart

我好像有个帖子 ,关于 通过 for 命令 把diskpart 指令集群 通过 管道 传递给 diskpart ,如此就不用 生成临时的 脚本文件了。

点评

学习了。显示硬盘数量还好办,显示分区数量就搞不定了。你在一个for命令中如何用echo同时把secele disk 0和list partition两道命令同时传递给diskpart  详情 回复 发表于 2022-8-22 12:14
回复

使用道具 举报

4#
发表于 2022-8-22 08:45:39 | 只看该作者
谢谢分享。
回复

使用道具 举报

5#
 楼主| 发表于 2022-8-22 12:14:39 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

6#
发表于 2022-8-22 12:35:53 | 只看该作者
(echo sele disk %d%&echo clean&echo convert mbr&echo crea part prim&echo shrink DESIRED=920&echo crea part prim&echo acti&echo list part&echo format fs=fat32 quick label=UESP&echo assign letter=v&echo sele part 1&echo format fs=exfat quick label=UPE&echo assign letter=u)|diskpart

点评

这个方法我试过,只会提示你此时不应该存在&  详情 回复 发表于 2022-8-22 12:41

评分

参与人数 1无忧币 +2 收起 理由
dfw9 + 2 赞一个!

查看全部评分

回复

使用道具 举报

7#
 楼主| 发表于 2022-8-22 12:41:03 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

8#
 楼主| 发表于 2022-8-22 12:41:43 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

9#
发表于 2022-8-22 12:43:14 | 只看该作者
bjay2008xmy 发表于 2022-8-22 12:41
这个方法我试过,只会提示你此时不应该存在&

俺发在群里,群友用了好多年了。

点评

我再试试,可能是我没有加括号的原因  详情 回复 发表于 2022-8-22 12:56
回复

使用道具 举报

10#
 楼主| 发表于 2022-8-22 12:56:28 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

11#
发表于 2022-8-22 13:10:57 | 只看该作者
bjay2008xmy 发表于 2022-8-22 12:14
学习了。显示硬盘数量还好办,显示分区数量就搞不定了。你在一个for命令中如何用echo同时把select  disk  ...

http://bbs.wuyou.net/forum.php?m ... d=423983&extra=
回复

使用道具 举报

12#
发表于 2022-8-22 13:12:40 | 只看该作者
本帖最后由 dos时代菜鸟 于 2022-8-22 16:31 编辑

用 “type 文本文件内容 | diskpart” 的方法 可以根据输出结果中的 “DISKPART> ” 的数量计算 指令个数,这样就有个初步制作 计数器的 基础思路,其他的,就好办了。
分区编号是 0 的 ,是扩展分区

基本思路就是这样,针对 diskpart 的一些  懵瞪 bug 可能需要一些补救措施。此处就不扩展了。



  1.     @echo off
  2.     setlocal ENABLEDELAYEDEXPANSION
  3.     cls
  4.     echo ---------------------------------------%time%
  5.     set p=0
  6.     set "parts="
  7.     rem 获取硬盘编号并生成 探测分区编号的脚本 第一次diskpart
  8.     (
  9.     for /f "skip=9 tokens=2 delims= " %%c in ('echo list disk^|diskpart') do (
  10.         echo select disk %%c
  11.         echo list partition
  12.     )
  13.     )>temp.txt
  14.     rem 获取 分区编号列表变量 parts 第二次 diskpart
  15.     set n=0
  16.     for /f "delims=" %%c in ('type temp.txt^|diskpart') do (
  17.         set "str1=%%c"
  18.         if "%%c"=="DISKPART> " set /a n=n+1
  19.         if "!str1:~0,2!"=="磁盘" set /a d0=!str1:~2,3!
  20.         if "!str1:~2,2!"=="分区" (if not "!str1:~5,1!"=="#" (
  21.             set /a p0=!str1:~5,8!
  22.             if not !p0!==0 (
  23.                 set parts=!parts! !d0!.!p0!
  24.                 set /a p=p+1
  25.             )
  26.         ))
  27.     )
  28.     set /a d=n/2
  29.     rem 生成获取硬盘分区对应的卷信息的脚本,运行脚本并显示出分区和卷信息
  30.     echo 硬盘 分区 盘符 卷标         格式      大小   状态         信息
  31.     echo ------------------------------------------------------------------------
  32.     (
  33.         for %%c in (!parts!) do (for /f "tokens=1,2 delims=." %%i in ("%%c") do (
  34.             echo select disk %%i
  35.             echo select partition %%j
  36.             echo detail partition
  37.         ))
  38.         echo rem
  39.     )>temp.txt
  40.     rem 第三次 diskpart
  41.     set n=0
  42.     set p0=
  43.     for /f "delims=" %%c in ('type temp.txt ^|diskpart') do (
  44.         set "str1=%%c"
  45.         if "%%c"=="DISKPART> " (
  46.             set /a n=n+1
  47.             set /a x=n/3*3+1
  48.         )
  49.         if "!str1:~0,2!"=="磁盘"  set str2=!str1:~2,3!
  50.         if "!str1:~0,2!"=="分区"  set p0=!str1:~2,3!
  51.         if "!str1:~0,1!"=="*"     set "str2=!str2! !p0!     !str1:~14,24!   !str1:~50!"
  52.         if !x! equ !n! (if not "!p0!"=="" (
  53.             echo !str2!
  54.             set p0=
  55.         ))
  56.     )
  57.     echo ------------------------------------------------------------------------
  58.     echo 共有!d!个硬盘,!p!个分区。
  59.     echo ---------------------------------------%time%
  60.     pause

复制代码

点评

在for命令中用echo传递多条命令给diskpart确实复杂一点,在for命令外就简单点括号内用&把几条命令连起来就行了  详情 回复 发表于 2022-8-22 13:25
回复

使用道具 举报

13#
 楼主| 发表于 2022-8-22 13:25:58 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

14#
发表于 2022-8-22 13:33:24 | 只看该作者
bjay2008xmy 发表于 2022-8-22 13:25
在for命令中用echo传递多条命令给diskpart确实复杂一点,在for命令外就简单点括号内用&把几条命令连起来 ...

有时需要用 for 循环 实现把 获取所有分区 信息的指令集合 一次性传递给 diskpart,简单的就是 先生成指令文本,再 用 type 把 文本内容 管道传递给  diskpart.
回复

使用道具 举报

15#
发表于 2022-8-22 13:41:30 | 只看该作者
本帖最后由 dos时代菜鸟 于 2022-8-22 18:39 编辑

用 diskpart 获取全部 硬盘分区信息 ,难点是 要尽量少的 运行 diskpart ,因为 那玩意儿 启动一次 费时间。所以,就要考虑 事先把 指令都弄粗来,一次性 传递给 diskpart 执行,再 想办法 分析 命令结果,获取 硬盘分区信息。这就避免不了用 计数器。
所以我 考虑 用  type 把 指令集 通过管道 传递给 diskpart , 这样和 /s 脚本方式 的区别在于 指令结果中有 “DISKPART> ” 提示符行,每运行一个 diskpart 指令,就 有一个 这样的提示行。这就有了计数器的 基础。经过计算,就可以 分析出 是 那一条指令 输出了什么信息。 这样就 一定能得到 我们所要的数据信息 和结果。

也就是 整体上 运行三次 diskpart 就可以了,不管有多少硬盘 和分区,都只运行 三次 diskpart .就能出结果。

不用 文本,用  & 链接也可以,如下:同样需要 用到 for ,只是把  "echo diskpart指令" 保存成变量 传递给 diskpart .


  1.     @echo off
  2.     setlocal ENABLEDELAYEDEXPANSION
  3.     cls
  4.     set t1=%time%
  5.     echo ---------------------------------------%time%
  6.     set p=0
  7.     set "parts="
  8.     rem 获取硬盘编号并生成 探测分区编号的脚本 第一次diskpart
  9.     echo 正在探测硬盘编号和数量。。。。。。
  10.     set cmd1=
  11.     for /f "skip=9 tokens=2 delims= " %%c in ('echo list disk^|diskpart') do (
  12.         if "!cmd1!"=="" (
  13.             set cmd1=echo select disk %%c ^& echo list partition
  14.         ) else (
  15.             set cmd1=!cmd1! ^& echo select disk %%c ^& echo list partition
  16.         )
  17.     )
  18.    
  19.     rem 获取 分区编号列表变量 parts 第二次 diskpart
  20.     echo 正在探测分区编号和数量。。。。。。
  21.     set n=0
  22.     for /f "delims=" %%c in ('^(!cmd1!^)^|diskpart') do (
  23.         set "str1=%%c"
  24.         if "%%c"=="DISKPART> " set /a n=n+1
  25.         if "!str1:~0,2!"=="磁盘" set /a d0=!str1:~2,3!
  26.         if "!str1:~2,2!"=="分区" (if not "!str1:~5,1!"=="#" (
  27.             set /a p0=!str1:~5,8!
  28.             if not !p0!==0 (
  29.                 set parts=!parts! !d0!.!p0!
  30.                 set /a p=p+1
  31.             )
  32.         ))
  33.     )
  34.     set /a d=n/2
  35.     rem 生成获取硬盘分区对应的卷信息的脚本,运行脚本并显示出分区和卷信息
  36.     echo 正在获取分区对应的卷信息。。。。。。
  37.     set cmd1=
  38.     for %%c in (!parts!) do (for /f "tokens=1,2 delims=." %%i in ("%%c") do (
  39.             if "!cmd1!"=="" (
  40.                 set cmd1=echo select disk %%i ^& echo select partition %%j ^& echo detail partition
  41.             ) else (
  42.                 set cmd1=!cmd1! ^& echo select disk %%i ^& echo select partition %%j ^& echo detail partition
  43.             )
  44.     ))
  45.     set cmd1=!cmd1! ^& echo rem
  46.     rem 第三次 diskpart
  47.     set n=0
  48.     set p0=
  49.     set m=0
  50.     for /f "delims=" %%c in ('^(!cmd1!^) ^|diskpart') do (
  51.         set "str1=%%c"
  52.         if "%%c"=="DISKPART> " (
  53.             set /a n=n+1
  54.             set /a x=n/3*3+1
  55.         )
  56.         if "!str1:~0,2!"=="磁盘"  set d0=!str1:~2,3!
  57.         if "!str1:~0,2!"=="分区"  set p0=!str1:~2,3!
  58.         if "!str1:~0,1!"=="*"     set "str2=!str1:~14,24!   !str1:~50!"
  59.         if !x! equ !n! (if not "!p0!"=="" (
  60.             set /a m=m+1
  61.             set part_!m!=!d0! !p0!      !str2!
  62.             set p0=
  63.             set str2=
  64.         ))
  65.     )
  66.     set t2=%time%
  67.    
  68.     rem 显示结果
  69.     cls
  70.     echo ---------------------------------------%t1%
  71.     echo.
  72.     echo 硬盘 分区 盘符 卷标         格式      大小   状态         信息
  73.     echo ------------------------------------------------------------------------
  74.     for /l %%c in (1,1,!p!)  do (echo !part_%%c!)
  75.     echo ------------------------------------------------------------------------
  76.     echo.
  77.     echo 共有!d!个硬盘,!p!个分区。
  78.     echo ---------------------------------------%t2%
  79.     pause
复制代码



点评

起码也要分两次才行,第一次先运行list disk命令看看有多少块硬盘,再根据硬盘数量生成显示所有硬盘分区的脚本。  详情 回复 发表于 2022-8-22 14:50
回复

使用道具 举报

16#
 楼主| 发表于 2022-8-22 14:50:36 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

17#
发表于 2022-8-22 15:20:38 | 只看该作者
bjay2008xmy 发表于 2022-8-22 14:50
起码也要分两次才行,第一次先运行list disk命令看看有多少块硬盘,再根据硬盘数量生成显示所有硬盘分区 ...

对,如果需要 获取卷 信息,就 还需要 来一次。

点评

@echo off Setlocal Enabledelayedexpansion color 02 echo 本机磁盘列表: for /f "tokens=1-5 delims= " %%i in ('echo list disk^|diskpart^|findstr /i "联机"') do ( set /a n+=1 echo %%i %%j %%k 容  详情 回复 发表于 2022-8-22 15:37
回复

使用道具 举报

18#
 楼主| 发表于 2022-8-22 15:37:44 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

19#
发表于 2022-8-22 15:44:40 | 只看该作者
bjay2008xmy 发表于 2022-8-22 14:50
起码也要分两次才行,第一次先运行list disk命令看看有多少块硬盘,再根据硬盘数量生成显示所有硬盘分区 ...

如果用 ghost 自带的 omnifs64 可以一次获取出来
用 gdisk64 2次也可以。
回复

使用道具 举报

20#
发表于 2022-8-22 15:54:48 | 只看该作者
本帖最后由 dos时代菜鸟 于 2022-8-22 20:11 编辑
bjay2008xmy 发表于 2022-8-22 15:37
@echo off
Setlocal Enabledelayedexpansion
color 02

硬盘编号不一定是按顺序来的
比如 2u盘 ,拔掉一个。很可能 2号盘没了,3号盘还在。

所以,必须 对 指令输出进行分析,精准获取硬盘编号。

而且 你这个 看不出来 某个分区 属于 哪个硬盘。

parts4.7z (1.17 KB, 下载次数: 27)

点评

分区编号乱序了,要控制 1 6 7 8 9 2 3 4 5  详情 回复 发表于 2022-8-22 20:36
回复

使用道具 举报

21#
 楼主| 发表于 2022-8-22 20:36:23 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

22#
发表于 2022-8-22 20:39:12 | 只看该作者
本帖最后由 dos时代菜鸟 于 2022-8-22 20:40 编辑
bjay2008xmy 发表于 2022-8-22 20:36
分区编号乱序了,要控制
1 6 7 8 9 2 3 4 5

这个 是 分区时先后顺序造成的 是编号,不是序号。不是 人为编的,是 程序编的,不能改。
按照 分区位置先后显示,而他的编号 是按类似 分区创建时间顺序 来的。
看一下 分区的 偏移量 就更能理解了。

回复

使用道具 举报

23#
发表于 2022-8-22 20:57:09 | 只看该作者
U盘隐藏EFI区,因为分区ID改为42进行隐藏,显示不出来。

点评

打开cmd依次运行如下命令: 1、diskpart 2、list disk 3、看看U盘显示的是磁盘第几个编号 4、sele disk U盘编号 5、list partition 如果都显示不出来就没办法了  详情 回复 发表于 2022-8-22 23:25
u盘 是 mbr 分区? efi 是 fat32 ? 如果 改了 特殊 id 导致 win 不能识别,不能把其识别为一个win可用的卷 ,diskpart 也 是识别不了的。  详情 回复 发表于 2022-8-22 22:06
回复

使用道具 举报

24#
发表于 2022-8-22 22:06:51 | 只看该作者
darkmoon781015 发表于 2022-8-22 20:57
U盘隐藏EFI区,因为分区ID改为42进行隐藏,显示不出来。

u盘 是 mbr 分区? efi 是 fat32 ?

如果 改了 特殊 id 导致 win 不能识别,不能把其识别为一个win可用的卷 ,diskpart 也 是识别不了的。
回复

使用道具 举报

25#
 楼主| 发表于 2022-8-22 23:25:19 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

26#
发表于 2022-8-23 10:18:28 | 只看该作者
bjay2008xmy 发表于 2022-8-22 23:25
打开cmd依次运行如下命令:
1、diskpart
2、list disk

感谢,已经试过了,这种办法确实可以。

点评

能发个图看看吗  详情 回复 发表于 2022-8-23 10:31
回复

使用道具 举报

27#
 楼主| 发表于 2022-8-23 10:31:15 来自手机 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

28#
发表于 2022-8-23 10:37:31 | 只看该作者
本帖最后由 dos时代菜鸟 于 2022-8-23 11:23 编辑

相关 功能的 脚本  nttwqz 已经做得很完善,我这里只是 照着做个简单举例。就这样吧

很多关键字查询 都用的简体中文,所以 只使用 cp=936 的情况







parts5.7z (1.56 KB, 下载次数: 36)



点评

[attachimg]506392[/attachimg]  详情 回复 发表于 2022-8-23 11:29
回复

使用道具 举报

29#
 楼主| 发表于 2022-8-23 11:29:41 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

30#
发表于 2022-8-23 11:50:29 | 只看该作者

win7 下 diskpart 文本流 skip 跳过的行数 可能跟 win10 不一样

点评

之前用过一段时间的win10,感觉不好用就用回了win7  详情 回复 发表于 2022-8-23 11:54
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-11-29 11:03

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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