无忧启动论坛
标题: 准确判断本机有多少个硬盘和分区 [打印本页]
作者: bjay2008xmy 时间: 2022-8-21 20:56
提示: 作者被禁止或删除 内容自动屏蔽
作者: liuyanjun 时间: 2022-8-21 21:29
感谢分享 试了下很准确
作者: dos时代菜鸟 时间: 2022-8-22 08:33
diskpart 可以接收 管道传递指令
比如 : cmd 下输入
echo list disk | diskpart
我好像有个帖子 ,关于 通过 for 命令 把diskpart 指令集群 通过 管道 传递给 diskpart ,如此就不用 生成临时的 脚本文件了。
作者: 旁观者清 时间: 2022-8-22 08:45
谢谢分享。
作者: bjay2008xmy 时间: 2022-8-22 12:14
提示: 作者被禁止或删除 内容自动屏蔽
作者: szwp 时间: 2022-8-22 12:35
(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
作者: bjay2008xmy 时间: 2022-8-22 12:41
提示: 作者被禁止或删除 内容自动屏蔽
作者: bjay2008xmy 时间: 2022-8-22 12:41
提示: 作者被禁止或删除 内容自动屏蔽
作者: szwp 时间: 2022-8-22 12:43
俺发在群里,群友用了好多年了。
作者: bjay2008xmy 时间: 2022-8-22 12:56
提示: 作者被禁止或删除 内容自动屏蔽
作者: dos时代菜鸟 时间: 2022-8-22 13:10
http://bbs.wuyou.net/forum.php?m ... d=423983&extra=
作者: dos时代菜鸟 时间: 2022-8-22 13:12
本帖最后由 dos时代菜鸟 于 2022-8-22 16:31 编辑
用 “type 文本文件内容 | diskpart” 的方法 可以根据输出结果中的 “DISKPART> ” 的数量计算 指令个数,这样就有个初步制作 计数器的 基础思路,其他的,就好办了。
分区编号是 0 的 ,是扩展分区
基本思路就是这样,针对 diskpart 的一些 懵瞪 bug 可能需要一些补救措施。此处就不扩展了。
- @echo off
- setlocal ENABLEDELAYEDEXPANSION
- cls
- echo ---------------------------------------%time%
- set p=0
- set "parts="
- rem 获取硬盘编号并生成 探测分区编号的脚本 第一次diskpart
- (
- for /f "skip=9 tokens=2 delims= " %%c in ('echo list disk^|diskpart') do (
- echo select disk %%c
- echo list partition
- )
- )>temp.txt
- rem 获取 分区编号列表变量 parts 第二次 diskpart
- set n=0
- for /f "delims=" %%c in ('type temp.txt^|diskpart') do (
- set "str1=%%c"
- if "%%c"=="DISKPART> " set /a n=n+1
- if "!str1:~0,2!"=="磁盘" set /a d0=!str1:~2,3!
- if "!str1:~2,2!"=="分区" (if not "!str1:~5,1!"=="#" (
- set /a p0=!str1:~5,8!
- if not !p0!==0 (
- set parts=!parts! !d0!.!p0!
- set /a p=p+1
- )
- ))
- )
- set /a d=n/2
- rem 生成获取硬盘分区对应的卷信息的脚本,运行脚本并显示出分区和卷信息
- echo 硬盘 分区 盘符 卷标 格式 大小 状态 信息
- echo ------------------------------------------------------------------------
- (
- for %%c in (!parts!) do (for /f "tokens=1,2 delims=." %%i in ("%%c") do (
- echo select disk %%i
- echo select partition %%j
- echo detail partition
- ))
- echo rem
- )>temp.txt
- rem 第三次 diskpart
- set n=0
- set p0=
- for /f "delims=" %%c in ('type temp.txt ^|diskpart') do (
- set "str1=%%c"
- if "%%c"=="DISKPART> " (
- set /a n=n+1
- set /a x=n/3*3+1
- )
- if "!str1:~0,2!"=="磁盘" set str2=!str1:~2,3!
- if "!str1:~0,2!"=="分区" set p0=!str1:~2,3!
- if "!str1:~0,1!"=="*" set "str2=!str2! !p0! !str1:~14,24! !str1:~50!"
- if !x! equ !n! (if not "!p0!"=="" (
- echo !str2!
- set p0=
- ))
- )
- echo ------------------------------------------------------------------------
- echo 共有!d!个硬盘,!p!个分区。
- echo ---------------------------------------%time%
- pause
复制代码
作者: bjay2008xmy 时间: 2022-8-22 13:25
提示: 作者被禁止或删除 内容自动屏蔽
作者: dos时代菜鸟 时间: 2022-8-22 13:33
有时需要用 for 循环 实现把 获取所有分区 信息的指令集合 一次性传递给 diskpart,简单的就是 先生成指令文本,再 用 type 把 文本内容 管道传递给 diskpart.
作者: dos时代菜鸟 时间: 2022-8-22 13:41
本帖最后由 dos时代菜鸟 于 2022-8-22 18:39 编辑
用 diskpart 获取全部 硬盘分区信息 ,难点是 要尽量少的 运行 diskpart ,因为 那玩意儿 启动一次 费时间。所以,就要考虑 事先把 指令都弄粗来,一次性 传递给 diskpart 执行,再 想办法 分析 命令结果,获取 硬盘分区信息。这就避免不了用 计数器。
所以我 考虑 用 type 把 指令集 通过管道 传递给 diskpart , 这样和 /s 脚本方式 的区别在于 指令结果中有 “DISKPART> ” 提示符行,每运行一个 diskpart 指令,就 有一个 这样的提示行。这就有了计数器的 基础。经过计算,就可以 分析出 是 那一条指令 输出了什么信息。 这样就 一定能得到 我们所要的数据信息 和结果。
也就是 整体上 运行三次 diskpart 就可以了,不管有多少硬盘 和分区,都只运行 三次 diskpart .就能出结果。
不用 文本,用 & 链接也可以,如下:同样需要 用到 for ,只是把 "echo diskpart指令" 保存成变量 传递给 diskpart .
- @echo off
- setlocal ENABLEDELAYEDEXPANSION
- cls
- set t1=%time%
- echo ---------------------------------------%time%
- set p=0
- set "parts="
- rem 获取硬盘编号并生成 探测分区编号的脚本 第一次diskpart
- echo 正在探测硬盘编号和数量。。。。。。
- set cmd1=
- for /f "skip=9 tokens=2 delims= " %%c in ('echo list disk^|diskpart') do (
- if "!cmd1!"=="" (
- set cmd1=echo select disk %%c ^& echo list partition
- ) else (
- set cmd1=!cmd1! ^& echo select disk %%c ^& echo list partition
- )
- )
-
- rem 获取 分区编号列表变量 parts 第二次 diskpart
- echo 正在探测分区编号和数量。。。。。。
- set n=0
- for /f "delims=" %%c in ('^(!cmd1!^)^|diskpart') do (
- set "str1=%%c"
- if "%%c"=="DISKPART> " set /a n=n+1
- if "!str1:~0,2!"=="磁盘" set /a d0=!str1:~2,3!
- if "!str1:~2,2!"=="分区" (if not "!str1:~5,1!"=="#" (
- set /a p0=!str1:~5,8!
- if not !p0!==0 (
- set parts=!parts! !d0!.!p0!
- set /a p=p+1
- )
- ))
- )
- set /a d=n/2
- rem 生成获取硬盘分区对应的卷信息的脚本,运行脚本并显示出分区和卷信息
- echo 正在获取分区对应的卷信息。。。。。。
- set cmd1=
- for %%c in (!parts!) do (for /f "tokens=1,2 delims=." %%i in ("%%c") do (
- if "!cmd1!"=="" (
- set cmd1=echo select disk %%i ^& echo select partition %%j ^& echo detail partition
- ) else (
- set cmd1=!cmd1! ^& echo select disk %%i ^& echo select partition %%j ^& echo detail partition
- )
- ))
- set cmd1=!cmd1! ^& echo rem
- rem 第三次 diskpart
- set n=0
- set p0=
- set m=0
- for /f "delims=" %%c in ('^(!cmd1!^) ^|diskpart') do (
- set "str1=%%c"
- if "%%c"=="DISKPART> " (
- set /a n=n+1
- set /a x=n/3*3+1
- )
- if "!str1:~0,2!"=="磁盘" set d0=!str1:~2,3!
- if "!str1:~0,2!"=="分区" set p0=!str1:~2,3!
- if "!str1:~0,1!"=="*" set "str2=!str1:~14,24! !str1:~50!"
- if !x! equ !n! (if not "!p0!"=="" (
- set /a m=m+1
- set part_!m!=!d0! !p0! !str2!
- set p0=
- set str2=
- ))
- )
- set t2=%time%
-
- rem 显示结果
- cls
- echo ---------------------------------------%t1%
- echo.
- echo 硬盘 分区 盘符 卷标 格式 大小 状态 信息
- echo ------------------------------------------------------------------------
- for /l %%c in (1,1,!p!) do (echo !part_%%c!)
- echo ------------------------------------------------------------------------
- echo.
- echo 共有!d!个硬盘,!p!个分区。
- echo ---------------------------------------%t2%
- pause
复制代码
作者: bjay2008xmy 时间: 2022-8-22 14:50
提示: 作者被禁止或删除 内容自动屏蔽
作者: dos时代菜鸟 时间: 2022-8-22 15:20
对,如果需要 获取卷 信息,就 还需要 来一次。
作者: bjay2008xmy 时间: 2022-8-22 15:37
提示: 作者被禁止或删除 内容自动屏蔽
作者: dos时代菜鸟 时间: 2022-8-22 15:44
如果用 ghost 自带的 omnifs64 可以一次获取出来
用 gdisk64 2次也可以。
作者: dos时代菜鸟 时间: 2022-8-22 15:54
本帖最后由 dos时代菜鸟 于 2022-8-22 20:11 编辑
硬盘编号不一定是按顺序来的
比如 2u盘 ,拔掉一个。很可能 2号盘没了,3号盘还在。
所以,必须 对 指令输出进行分析,精准获取硬盘编号。
而且 你这个 看不出来 某个分区 属于 哪个硬盘。
parts4.7z
(1.17 KB, 下载次数: 28)