|
本帖最后由 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
复制代码
|
|