|  | 
| 利用 gdisk + awk +ndlist +bat 实现全部硬盘分区序列列表和最后一个可行备份分区位置(%lastp%)的确定,支持多个硬盘信息的搜集。 有多个 主引导分区时 lastp 被设置为 最后一个主引导分区
 少于2个主引导分区时 lastp 被设置为 最后一个逻辑分区
 只有一个分区且为主引导分区时 lastp 为 空
 只有一个分区且为逻辑分区时    lastp 为该逻辑分
 如果装载了 ifsdrv 也可以把ifsdrv 装载的分区盘符对应于表中。
 awk/ndlist/drv0.awk/disks1.bat  另需要 gdisk.exe  v11自己找吧。
 
 这里需要3个文件的整理融合: ndlist.txt (ifsdrv装载盘符列表)  gd.txt(gdisk 获取的硬盘分区信息列表) gdraw.txt(gdisk /raw 获取的分区信息主要用到他的 sys 列)
 还有就是 没有分配盘符的可以被ifsdrv 装载的分区 对应的 id 类型表:0C,1C,04,14,06,16,0B,1B,07,17,01,11,0E,1E,83
 
 
 因为 gdisk 体积庞大,调用耗时较多,运行会慢一些,但是 gdisk 获取的磁盘信息与ghost 兼容性更好一些,毕竟都是 ghost出品的。所以,要用ghost做备份,探测分区信息还是用 gdisk 要更稳妥一些。
 
 disks1.bat 内容:
 @echo off
 if not %1*==* goto s2
 if exist drv0.txt del drv0.txt >nul
 ndlist >ndlist.txt
 cls
 echo 正在获取硬盘分区信息,请等待....
 gdisk |awk 'NF>0 && $1!="Disk" {print "call disks1.bat "$1}' >disksx.bat
 call disksx.bat
 del disksx.bat
 echo.
 echo 全部硬盘分区序列:
 echo 标号,盘符,ID,状态,类型,卷标,大小,格式,% ...
 type drv0.txt
 awk '/PRIMARY/' DRV0.TXT|AWK '{if (FNR==1) print "set p0="$1;p9=$1} END {print "set p9="p9}>%temp%\px.bat
 awk '/LOGICAL/' DRV0.TXT|AWK '{l9=$1} END {print "set l9="l9}>>%temp%\px.bat
 call %temp%\px.bat
 del  %temp%\px.bat
 set lastp=%p9%
 if (%p9%)==(%p1%) set lastp=%l9%
 for %%c in (p0 p9 l0 l9) do set %%c=
 echo Last_partiton is %lastp%
 goto end
 :s2
 echo 正在分析硬盘 #%1 ...
 gdisk %1 >gd.txt
 gdisk %1 /raw >gdraw.txt
 awk -f drv0.awk -v d=%1 gd.txt >>drv0.txt
 :end
 if exist gd.txt del gd.txt >nul
 if exist gdraw.txt del gdraw.txt >nul
 if exist ndlist.txt del ndlist.txt >nul
 
 -----------------
 drv0.awk 内容:
 BEGIN {d()}
 {drv3()}
 END {}
 function drv3() {
 if (($0~"PRIMARY") || ($0~"LOGICAL")) {
 m+=1
 dd=substr($0,2,2)
 if (substr($0,2,2)!~":") {dd="?."
 if ((ifs[1]!="Unavailable") && (ifsdrv~id[m])) {y+=1;dd=ifs[y]}
 }
 printf "%5s" ,d":"m;printf "%4s",dd" ";print id[m],substr($0,15)
 }
 }
 function d() {
 ifsdrv="0C,1C,04,14,06,16,0B,1B,07,17,01,11,0E,1E,83"
 while ((getline<"gdraw.txt")>0) {
 if (($0~"PRIMARY") || ($0~"LOGICAL")) {n+=1;id[n]=$4}
 }
 while ((getline<"ndlist.txt")>0) {l+=1;ifs[(l-1)]=$1}
 }
 ----------------------------
 
 [ 本帖最后由 dos时代菜鸟 于 2010-8-26 21:45 编辑 ]
 | 
 |