@echo off
set hdd=
set partn=
set zpartn=
set ntpartn=
cls
echo 正在检测硬盘, 请稍等...
gdisk >dk
find " " /c dk >dkn
rem 硬盘数的检测(不超过4个)
:4dk
find "5" dkn >nul
if errorlevel 1 goto 3dk
set hdd=4
goto 1dkpar
:3dk
find "4" dkn >nul
if errorlevel 1 goto 2dk
set hdd=3
goto 1dkpar
:2dk
find "3" dkn >nul
if errorlevel 1 goto 1dk
set hdd=2
goto 1dkpar
:1dk
find "2" dkn >nul
if errorlevel 1 goto 0dk
set hdd=1
goto 1dkpar
:0dk
set hdd=0
goto ext
rem 检测分区数的依据:(利用find.exe检测文件里含有特有字符的行数)
rem 命令: gdisk 1 可显示第1硬盘的分区信息
rem 命令: gdisk 2 可显示第2硬盘的分区信息
rem 命令: gdisk 1 >pt 把第1硬盘分区信息创建到pt文本文件里
rem 某些硬盘在作为从盘用时,只划分成逻辑分区,没划分出主分区
rem 在有1个主分区时,逻辑分区数加1等于实际的分区数
rem 在没有主分区时,逻辑分区数就是实际的分区数
rem 第1硬盘中的分区数检测(不超过9个)
:1dkpar
gdisk 1 >pt
find "No partitions defined" pt >nul
if not errorlevel 1 goto nopar
find "LOGICAL" /c pt >ptn
goto 1par
rem 仅有1主分区(没有逻辑分区)
:1par
find "PRIMARY" pt >nul
if errorlevel 1 goto 1logpar
find "LOGICAL" pt >nul
if not errorlevel 1 goto 2par
set partn=1
goto 2dkpar
rem 仅有1个分区(有1个逻辑分区和没有主分区)
:1logpar
find "1" ptn >nul
if errorlevel 1 goto 2logpar
set partn=1
goto 2dkpar
rem 仅有2个分区(有2个逻辑分区和没有主分区)
:2logpar
find "2" ptn >nul
if errorlevel 1 goto 3logpar
set partn=2
goto 2dkpar
:3logpar
find "3" ptn >nul
if errorlevel 1 goto 4logpar
set partn=3
goto 2dkpar
:4logpar
find "4" ptn >nul
if errorlevel 1 goto 5logpar
set partn=4
goto 2dkpar
:5logpar
find "5" ptn >nul
if errorlevel 1 goto 6logpar
set partn=5
goto 2dkpar
:6logpar
find "6" ptn >nul
if errorlevel 1 goto 7logpar
set partn=6
goto 2dkpar
:7logpar
find "7" ptn >nul
if errorlevel 1 goto 8logpar
set partn=7
goto 2dkpar
:8logpar
find "8" ptn >nul
if errorlevel 1 goto 9logpar
set partn=8
goto 2dkpar
:9logpar
find "9" ptn >nul
if errorlevel 1 goto err
set partn=9
goto 2dkpar
rem 仅有2个分区(有1个逻辑分区和1个主分区)
:2par
find "1" ptn >nul
if errorlevel 1 goto 3par
set partn=2
goto 2dkpar
rem 仅有3个分区(有2个逻辑分区和1个主分区)
:3par
find "2" ptn >nul
if errorlevel 1 goto 4par
set partn=3
goto 2dkpar
:4par
find "3" ptn >nul
if errorlevel 1 goto 5par
set partn=4
goto 2dkpar
:5par
find "4" ptn >nul
if errorlevel 1 goto 6par
set partn=5
goto 2dkpar
:6par
find "5" ptn >nul
if errorlevel 1 goto 7par
set partn=6
goto 2dkpar
:7par
find "6" ptn >nul
if errorlevel 1 goto 8par
set partn=7
goto 2dkpar
:8par
find "7" ptn >nul
if errorlevel 1 goto 9par
set partn=8
goto 2dkpar
:9par
find "8" ptn >nul
if errorlevel 1 goto err
set partn=9
goto 2dkpar
:err
set partn=?
goto 2dkpar
rem 第1硬盘中没有分区
:nopar
set partn=0
goto 2dkpar
rem 第2硬盘分区数检测(不超过9个)
:2dkpar
if %hdd%==1 goto ntpar
gdisk 2 >zpt
find "No partitions defined" zpt >nul
if not errorlevel 1 goto znopar
find "LOGICAL" /c zpt >zptn
goto z1par
:z1par
find "PRIMARY" zpt >nul
if errorlevel 1 goto z1logpar
find "LOGICAL" zpt >nul
if not errorlevel 1 goto z2par
set zpartn=1
goto ntpar
:z1logpar
find "1" zptn >nul
if errorlevel 1 goto z2logpar
set zpartn=1
goto ntpar
:z2logpar
find "2" zptn >nul
if errorlevel 1 goto z3logpar
set zpartn=2
goto ntpar
:z3logpar
find "3" zptn >nul
if errorlevel 1 goto z4logpar
set zpartn=3
goto ntpar
:z4logpar
find "4" zptn >nul
if errorlevel 1 goto z5logpar
set zpartn=4
goto ntpar
:z5logpar
find "5" zptn >nul
if errorlevel 1 goto z6logpar
set zpartn=5
goto ntpar
:z6logpar
find "6" zptn >nul
if errorlevel 1 goto z7logpar
set zpartn=6
goto ntpar
:z7logpar
find "7" zptn >nul
if errorlevel 1 goto z8logpar
set zpartn=7
goto ntpar
:z8logpar
find "8" zptn >nul
if errorlevel 1 goto z9logpar
set zpartn=8
goto ntpar
:z9logpar
find "9" zptn >nul
if errorlevel 1 goto zerr
set zpartn=9
goto ntpar
:z2par
find "1" zptn >nul
if errorlevel 1 goto z3par
set zpartn=2
goto ntpar
:z3par
find "2" zptn >nul
if errorlevel 1 goto z4par
set zpartn=3
goto ntpar
:z4par
find "3" zptn >nul
if errorlevel 1 goto z5par
set zpartn=4
goto ntpar
:z5par
find "4" zptn >nul
if errorlevel 1 goto z6par
set zpartn=5
goto ntpar
:z6par
find "5" zptn >nul
if errorlevel 1 goto z7par
set zpartn=6
goto ntpar
:z7par
find "6" zptn >nul
if errorlevel 1 goto z8par
set zpartn=7
goto ntpar
:z8par
find "7" zptn >nul
if errorlevel 1 goto z9par
set zpartn=8
goto ntpar
:z9par
find "8" zptn >nul
if errorlevel 1 goto zerr
set zpartn=9
goto ntpar
:zerr
set zpartn=?
goto ntpar
:znopar
set zpartn=0
goto ntpar
rem 以下是对NTFS分区数的检测(两个硬盘总NTFS分区数不超过9个)
:ntpar
set ntpartn=0
type pt >ntpt
if exist zpt type zpt >>ntpt
find "NTFS" /c ntpt >ntptn
:1ntptn
find "1" ntptn >nul
if errorlevel 1 goto 2ntptn
set ntpartn=1
goto ext
:2ntptn
find "2" ntptn >nul
if errorlevel 1 goto 3ntptn
set ntpartn=2
goto ext
:3ntptn
find "3" ntptn >nul
if errorlevel 1 goto 4ntptn
set ntpartn=3
goto ext
:4ntptn
find "4" ntptn >nul
if errorlevel 1 goto 5ntptn
set ntpartn=4
goto ext
:5ntptn
find "5" ntptn >nul
if errorlevel 1 goto 6ntptn
set ntpartn=5
goto ext
:6ntptn
find "6" ntptn >nul
if errorlevel 1 goto 7ntptn
set ntpartn=6
goto ext
:7ntptn
find "7" ntptn >nul
if errorlevel 1 goto 8ntptn
set ntpartn=7
goto ext
:8ntptn
find "8" ntptn >nul
if errorlevel 1 goto 9ntptn
set ntpartn=8
goto ext
:9ntptn
find "9" ntptn >nul
if errorlevel 1 goto ext
set ntpartn=9
goto ext
rem -------------------------------------------------------------------------------
rem 硬盘检测程序说明
rem -------------------------------------------------------------------------------
rem
rem 本程序是依据gdisk程序的检测硬盘功能,利用命令">***把产生的信息创建到一个文本文件
rem 中,并用程序find来查找其中的关键字符串,以达到分区数的检测. 除可利用gdisk来检测硬
rem 盘外,也可用ghost.exe程序来检测硬盘,命令行为:ghost -dd >nul,生成的分区信息保存在
rem 当前目录下的ghststat.txt中,可以用find程序来查找其中的关键字符串来确定分区数.
rem
rem 注意: 请在本程序(FINDHDD.BAT)同一目录下放置: gdisk.exe和find.exe程序.
rem 本程序适合含主分区在内的1-9个分区检测,或不含主分区的1-9个逻辑分区检测.
rem 如果分区数超过9个时,本程序会出错,所得的partn和zpartn值将不准确.
rem
rem 变量hdd的值为1-4,表示硬盘数为1-4个,hdd为0时无硬盘.
rem 变量partn的值为1-9,表示第1硬盘有1-9个分区,partn为0表示无分区.
rem 变量zpartn的值为1-9,表示第2硬盘有1-9个分区,zpartn为0表示无分区.
rem 变量partn和zpartn等于?时,表示分数已超过9个.具体分区数请在主菜单下按P键查看.
rem 变量ntpartn等于1-9时,表示存在NTFS分区数为1-9个,ntpartn为0时表示没有NTFS分区.
rem -------------------------------------------------------------------------------
rem 删除临时生成的文本文件并退出
:ext
if exist dk del dk
if exist dkn del dkn
if exist ntpt del ntpt
if exist ntptn del ntptn
if exist pt del pt
if exist ptn del ptn
if exist zpt del zpt
if exist zptn del zptn