Ghost自动备份时,活动主分区、最后分区号与盘符的确定思路和批处理
使用了第三方软件minitow(for win)/minito(for dos),软件下载及使用可去dos联盟。
一、windows下解决方案
(一)思路
1,用minitow获得硬盘信息。实例如下:
------------------------------------
N:N DOS WIN PRI/LOG ACT HIDE ID FILE SYSTEM LABEL TOTALmb FREEmb
1:1 = C: C: PRIMARY YES NO 0B FAT32 NO NAME 7538 3652
1:2 = E: PRIMARY NO YES 17 NTFS/HPFS 7467 0
1:3 = F: D: LOGICAL NO NO 07 NTFS/HPFS 10001 7524
1:4 = G: E: LOGICAL NO NO 07 NTFS/HPFS 15005 8483
1:5 = D: F: LOGICAL NO NO 0B FAT32 APPZ 30004 17382
1:6 = H: G: LOGICAL NO NO 07 NTFS/HPFS 44453 19427
------------------------------------
2,对上面的信息进行处理,获得活动主分区,及最后分区和最后分区对应的盘符。
(二)具体方法。
【说明,本人水平有限,相信有更好的处理办法。下面的批处理是正在使用的,正确性应基本没问题。
批处理中的一些代码改造自他人在回答其它问题时的答复。】
dos下的思路相同,处理方法有些不同。
批处理如下。【】为说明。
-------------------------------
@echo off
rem by lianjiang
rem 【获得硬盘参数,保存文件名为hdmini.txt】
tools\minitow /nohp /ifs /p>temp\hdmini.txt
rem 【生成简化的硬盘信息,此部分不是必须,只是由于一些信息个人以为不很重要,去除,新文件为hdmini_1.txt】
setlocal EnableDelayedexpansion
if exist temp\hdmini_1.txt del temp\hdmini_1.txt >nul
For /f "tokens=1 delims=\" %%i In (temp\hdmini.txt) do (
Set var=%%i
call :sub_012
)
endlocal
rem 【读取活动主分区的分区号%act%,最后分区号%lpartition%及最后分区对应的盘符%ldrive%,可用空间%freesize%】
For /f "tokens=1-3" %%i In (temp\hdmini_1.txt) do (
Set lpartition=%%i
Set ldrive=%%j
set freesize=%%k
if %%j.==C:. set act=%%i
)
echo 活动主分区号%act% 最后分区号%lpartition% 最后分区对应的盘符%ldrive%
pause
goto sub_018
:sub_012
rem 【取N:N WIN FREEmb三项数据】
set s1=!%var:~1,3!
set s3=!%var:~12,3!
set s10=!%var:~69,6!
echo %s1% %s3% %s10%>>temp\hdmini_1.txt
goto :eof
:sub_018
rem 【继续其他处理】
----------------
新文件hdmini_b.txt的形式如:
N:N WIN FREEmb
1:1 C: 3652
1:2 0
1:3 D: 7524
1:4 E: 8483
1:5 F: 17382
1:6 G: 19427
=============================
利用DSPTW取活动分区的分区号和盘符
以下是DSPTW产生的磁盘分区列表a.txt:
CODE:
No. Dr Tag FileSystem Volume Act StartPos Sectors MBytes FreeMB
1:1 Pri HIDE_DELL 63 144522 70
1:2 I: Pri HPFS/NTFS RECOVERY 145408 20971520 10240 4105
1:3 D: Pri HPFS/NTFS OS Yes 21116928 83886080 40960 21514
1:4 C: Log HPFS/NTFS DATAPART1 105005056 101298176 49462 6122
1:5 E: Log HPFS/NTFS SOFT 206305280 20480000 10000 2382
1:6 F: Log HPFS/NTFS BACKUP 226787328 80592896 39352 12603
1:7 Log HIDE_DELL 307382272 5195776 2537任务:找到YES(活动分区标识)所在行的分区号和盘符,分别赋予变量 a1 和 a2 ,本例的结果应该是 a1=3 , a2=D
要求:用FOR和FINDSTR等自带命令,不要使用第三方工具,输出用echo a1和echo a2,分别只用一行完成。
CODE:
for /f "tokens=2,3 delims=: " %%i in ('findstr /i " Yes " a.txt') do set a1=%%i&set a2=%%j&&call echo %%a1%% %%a2%%以上代码通过测试。
二、DOS下解决方案。
所需工具:minito,strings,ifs
(一)思路与windows下相同。
由于可能要在NTFS分区创建新目录,因此获取的是加载了ifs驱动后的dos下盘符。不创建目录的话,不需要确定最后分区对应的盘符。
示例如下
N:N : PRI/LOG ACT HIDE ID FILE SYSTEM LABEL TOTALmb FREEmb
1:1 = C: PRIMARY YES NO 0B FAT32 WINXP 7538 3619
1:2 = E: PRIMARY NO YES 17 NTFS/HPFS 7467
1:3 = F: LOGICAL NO NO 07 NTFS/HPFS 10001
1:4 = G: LOGICAL NO NO 07 NTFS/HPFS 15005
1:5 = D: LOGICAL NO NO 0B FAT32 APPZ 30004 17234
1:6 = H: LOGICAL NO NO 07 NTFS/HPFS 44453
(二)批处理。
@echo off
:mini_BEGIN
if exist mini_dd.txt del mini_dd.txt
minito /nohp /p /ifs>mini_dd.txt
rem 文件行数
strings lines=LINESIZE mini_dd.txt
if %lines%#==0# goto quit
strings lines=add %lines%,1
set line=1
echo 硬盘信息:
:mini
strings line=add %line%,1
if %line%#==%lines%# goto mini_1
strings lined=read mini_dd.txt,%line%
strings row1=left %lined%,3
strings row3=mid %lined%,8,2
strings row5=mid %lined%,19,3
if %row5%#==YES# set actp=%row1%
set lastp=%row1%
set lastd=%row3%
if not %lined%#==# echo %lined%
rem if not %lined%#==# echo %lined%>>hdinfor.ini
rem if %row1%#==N:N# goto mini
rem if %row5%#==YES# goto mini
rem echo %lined%>>hdinforb.ini
goto mini
:mini_1
echo.
echo 请根据上面显示的硬盘信息确认识别结果。
echo.
echo 自动识别结果:
echo 活动分区是%actp%
echo 最后分区是%lastp%
echo 最后分区对应的盘符是%lastd%
echo.
pause
goto exit
:fail
cls
echo.
echo 很抱歉,本工具采用的软件未能获得有效硬盘信息。
echo.
pause
:exit
============================
一键恢复中最后有效分区及活动分区的确定批处理(for DOS)
一键恢复中最后有效分区及活动分区的确定批处理(for DOS)
一键恢复工具中的最主要任务之一,就是确定有效最后分区与活动分区。
下面的批处理中使用了omnifs和gawk,仅供参考。
抛砖引玉。
图1,处理结果 图2,脚本
========================================
三、在Windows下手动改变盘符后,在DOS下也能正确识别,没问题,下面是测试结果。(虽然在Windows下把E:改成了M:,但在DOS下也能正确识别。)
1,硬盘信息。
N:N DOS WIN PRI/LOG ACT HIDE ID FILE SYSTEM LABEL TOTALmb FREEmb
1:1 = C: C: PRIMARY YES NO 0B FAT32 NO NAME 7538 3594
1:2 = E: PRIMARY NO YES 17 NTFS/HPFS 7467 0
1:3 = F: D: LOGICAL NO NO 07 NTFS/HPFS 10001 7576
1:4 = G: M: LOGICAL NO NO 07 NTFS/HPFS 15005 8530
1:5 = D: F: LOGICAL NO NO 0B FAT32 APPZ 30004 17233
1:6 = H: G: LOGICAL NO NO 07 NTFS/HPFS 44453 19378
2,输出结果:
活动主分区号1:1 最后分区号1:6 最后分区对应的盘符G:
-----------------------------------------------------------------
说明:以上处理方案,不适用于用U盘启动,且启动后u盘盘符为C:的情况(启动后盘符为A:的,仍可使用)。
附上处理方案中用到的工具,包括minitow(for win)/minito(for dos),strings.com。
点击下载判断最后分区的工具 (80.16 KB)
多硬盘识别方案:
小咕咚 说:
使用omnifs32或omnifs.exe:
DOS下:
@echo off
omnifs info >disk.txt
或Windows下:
@echo off
omnifs32 info >disk.txt
disk.txt内容为:
Disk: 1 (37.26GB) M:[37.26GB] S:[MPA245Q2HD7GWA]
1.1: ( 10.04GB) [C:\] Active Volume NTFS
1.2: ( 10.04GB) [D:\] Volume NTFS
1.3: ( 2.01GB) [E:\] Volume NTFS
1.4: ( 5.02GB) [F:\] Volume NTFS
1.5: ( 10.13GB) [G:\] Volume NTFS
1.6: ( 39.19MB) Volume FAT32 l:[ACRONIS SZ]
Disk: 2 (13.99GB) M:[13.99GB]
2.1: ( 10GB) [J:\] Volume NTFS l:[YD02-01]
2.2: ( 3.98GB) Hidden Volume FAT32
( 8.89MB) Unused Space
Disk: 3 (125MB) M:[125MB]
3.1: ( 117.63MB) [I:\] Active Volume FAT16
( 7.34MB) Unused Space
Disk: 4 (15.31MB) M:[15.31MB]
4.1: ( 15.28MB) [K:\] Volume FAT12 l:[CANON_DC] Removable Drive
Disk: 5 (37.27GB) M:[37.27GB]
5.1: ( 8.03GB) [L:\] Volume NTFS l:[YD01-01Ghost]
5.2: ( 12.05GB) [M:\] Volume NTFS l:[YD01-02Softs]
5.3: ( 8.03GB) [O:\] Volume NTFS l:[YD01-04Acronis]
5.4: ( 9.16GB) [N:\] Volume NTFS l:[YD01-03OK]
( 4.46MB) Unused Space
上面列表详细显示[omnifs版本为v11.0.0.1502]:
1、硬盘数量、型号;
2、各个硬盘[含U盘、移动硬盘]的分区数、分区类型、活动性、大小、是否隐藏。
从重定向产生的文本文件disk.txt中如何用批处理判断最后分区、活动分区?
lianjiang 说:
磁盘多不是问题。而是你到底想需要得到什么结果。
首先需要你确认以下信息:
最后分区是:
5.4: ( 9.16GB) [N:\] Volume NTFS l:[YD01-03OK]
活动分区为:
1.1: ( 10.04GB) [C:\] Active Volume NTFS
对否?还是只找第一硬盘最后分区?
因为有时最后磁盘的最后分区可能没多大实际意义。
haohaodlam 说:
minito 兼容性不是很好 SATA和ATA混用的情况下ODS下运行死机 (已经加了-NOHP)参数
lianjiang 说:我也发现minito兼容性不佳,已经放弃,gghost中早已改用dspt了。
点击下载DOS磁盘信息工具omnifs
点击下载DOS分区信息管理工具dspt
以下是老毛桃写的请参考:SET TestFile=Test_%RANDOM%.TMP
SETLOCAL ENABLEDELAYEDEXPANSION
For %%I In (C D E F G H I J K L M N O P Q R S T U V W X Y Z) Do (
CD.>%%I:\%TestFile%
CLS&&If Exist %%I:\%TestFile% Set ResultD=%%I:&&DEL %%I:\%TestFile% /Q
)
ECHO 最靠后的可写分区为:%ResultD%
IF EXIST %ResultD%\ghost (
ECHO %ResultD%\ghost 文件(夹)已经存在
) ELSE (
md %ResultD%\ghost\&ATTRib +S +H %ResultD%\ghost
)
ENDLOCAL
PAUSE
lianliang最新处理方案:
利用ghost的ghststat.txt确定活动分区及最后有效分区的方法 [09.06.19]
特点:此方法完全利用ghost自身的信息来进行一键恢复类工具所需的基本信息的处理。
1,用ghost -dd取得硬盘信息。
2,对生成的ghststat.txt进行处理,适用于ghost v8.0~ v11.02。
DOS处理脚本及结果见附图: