无忧启动论坛

标题: ghost自动备份时,活动主分区、最后分区号与盘符的确定思路和批处理(含win/dos下) [打印本页]

作者: lianjiang    时间: 2007-5-7 19:38
标题: ghost自动备份时,活动主分区、最后分区号与盘符的确定思路和批处理(含win/dos下)
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

=============================
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


============================
增加Windows下手动改变盘符后测试结果,没问题。(把E:改成了M:)

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。

[ 本帖最后由 lianjiang 于 2007-5-30 05:49 PM 编辑 ]

判断最后分区所用到的工具.rar

80.16 KB, 下载次数: 484, 下载积分: 无忧币 -2


作者: BBSwuu    时间: 2007-5-7 20:37
谢谢!留下来看看.
还不够字!哈哈
作者: BBSwuu    时间: 2007-5-7 20:39
为什么还要回答这样的问题才可以回复。中国首都..?
作者: shaosilly    时间: 2007-5-7 22:03
3Q lianjiang兄~~~有用!学习之~~~
作者: lianjiang    时间: 2007-5-8 08:44
增加dos下方案。供参考。
作者: xiaobendan    时间: 2007-5-8 13:15
太高深了,不过值得学习一下,谢谢。
作者: cchessbd    时间: 2007-5-8 13:49
原帖由 lianjiang 于 2007-5-7 07:38 PM 发表
ghost自动备份时,活动主分区、最后分区号与盘符的确定思路和批处理

使用了第三方软件minitow(for win)/minito(for dos),软件下载及使用可去dos联盟。

windows下解决方案

一,思路
1,用minitow获得 ...


Windows下面有他自己的逻辑,与DOS还是不一样的,我建议你把它独立出来。

Windows有可能发生盘符错乱(自动)的现象: 比如 H: = 1:3。

加入你没遇到过,你可以在磁盘管理里面手动更改分区所对应的盘符。
作者: lianjiang    时间: 2007-5-8 14:07
原帖由 cchessbd 于 2007-5-8 01:49 PM 发表


Windows下面有他自己的逻辑,与DOS还是不一样的,我建议你把它独立出来。

Windows有可能发生盘符错乱(自动)的现象: 比如 H: = 1:3。

加入你没遇到过,你可以在磁盘管理里面手动更改分区所对应的盘符。


1,1楼已有dos和windows下的批处理。
2,“Windows有可能发生盘符错乱(自动)的现象”,没任何问题,我是查找分区号后,再来定分区号对应的盘符的。并非根据盘符顺序。
作者: lianjiang    时间: 2007-5-8 14:14
看下面测试结果,Windows下手动改变盘符后没问题。(把E:改成了M:)


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:
作者: cchessbd    时间: 2007-5-15 08:24
标题: 回复 #9 lianjiang 的帖子
我知道单个硬盘是正确的.

我的意思是当有多个硬盘,启动顺序不一样的时候(dos与win)是不一样的.

单硬盘不同的主分区启动也有可能(dos与win)是不一样的.

所以Windows下面不能代替dos,最好是在DOS下直接应用.

还有一种比较特殊的情况是用 PPM调整了分区表项的顺序(slot)的硬盘,我没测试过.

所以不知道有问题没有.

[ 本帖最后由 cchessbd 于 2007-5-15 08:26 AM 编辑 ]
作者: lianjiang    时间: 2007-5-15 09:25
原帖由 cchessbd 于 2007-5-15 08:24 AM 发表
我知道单个硬盘是正确的.

你要早说,也就不用我测试了。看你上面的帖子,实在看不出来。
“Windows下面有他自己的逻辑,与DOS还是不一样的,我建议你把它独立出来。

Windows有可能发生盘符错乱(自动)的现象: 比如 H: = 1:3。

加入你没遇到过,你可以在磁盘管理里面手动更改分区所对应的盘符。 ”

麻烦你把你所说的其它情况也说清楚些。是一定出现,还是可能出现,还是不会出现。
对于一般情况,批处理有问题的话,我会删除顶贴。特殊情况,那就暂不考虑了,本人也没那水平。
希望能看到你的完美的解决方案。
作者: chengchun    时间: 2007-5-15 18:44
增加dos下方案。供参考。
作者: starrysky    时间: 2007-5-30 11:49
完美的解决方案!多谢楼主!
作者: lym0451    时间: 2007-5-30 12:38
有的时候也会出错!
比如:某些SATA硬盘,某些U盘启动的等等
作者: lianjiang    时间: 2007-5-30 12:46
原帖由 lym0451 于 2007-5-30 12:38 PM 发表
有的时候也会出错!
比如:某些SATA硬盘,某些U盘启动的等等

能否说说,解决方案中,是由于哪方面的限制造成在你说的条件下无法使用的?(U盘启动的,现未处理。这个问题记得解释过。)
作者: starrysky    时间: 2007-5-30 14:42
我在 DOS 联盟未找到 minito 和 strings 的下载地址,有的网页上的下载地址已经失效。楼主可以用附件上传这个批处理需要用到的几个软件吗,谢谢!
作者: lym0451    时间: 2007-5-30 15:24
BIOS调整不当
"terse"他遇到的是内存驱动问题!


这几天精神不佳,时间少,等过几天我把我的引导判断发上来,大家帮忙测试一下!

[ 本帖最后由 lym0451 于 2007-5-30 03:28 PM 编辑 ]
作者: lianjiang    时间: 2007-5-30 17:51
原帖由 starrysky 于 2007-5-30 02:42 PM 发表
我在 DOS 联盟未找到 minito 和 strings 的下载地址,有的网页上的下载地址已经失效。楼主可以用附件上传这个批处理需要用到的几个软件吗,谢谢!

处理方案中用到的工具,包括minitow(for win)/minito(for dos),strings.com。
已上传,见1楼。
作者: starrysky    时间: 2007-5-31 00:28
原帖由 lianjiang 于 2007-5-30 05:51 PM 发表

处理方案中用到的工具,包括minitow(for win)/minito(for dos),strings.com。
已上传,见1楼。


再次感谢!多谢了!
作者: starrysky    时间: 2007-5-31 00:39
原帖由 lianjiang 于 2007-5-7 07:38 PM 发表
……
-----------------------------------------------------------------
说明:以上处理方案,不适用于用U盘启动,且启动后u盘盘符为C:的情况(启动后盘符为A:的,仍可使用)。
……



这种情况可以用 XSet(新DOS时代有下载地址) 进行判断,然后根据判断结果再做进一步处理,应该不难解决。
作者: lianjiang    时间: 2007-5-31 06:42
原帖由 starrysky 于 2007-5-31 12:39 AM 发表



这种情况可以用 XSet(新DOS时代有下载地址) 进行判断,然后根据判断结果再做进一步处理,应该不难解决。

可以解决的,判断启动盘的盘符后再处理。只是现在u盘启动兼容性仍不理想,暂时gghost里只提供了硬盘版和光盘版,需要时再考虑u盘启动问题。
作者: 小咕咚    时间: 2007-5-31 15:15
使用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
作者: 小咕咚    时间: 2007-5-31 15:25
上面列表详细显示[omnifs版本为v11.0.0.1502]:
1、硬盘数量、型号;
2、各个硬盘[含U盘、移动硬盘]的分区数、分区类型、活动性、大小、是否隐藏。
从重定向产生的文本文件disk.txt中如何用批处理判断最后分区、活动分区?
作者: lym0451    时间: 2007-5-31 17:06
原帖由 小咕咚 于 2007-5-31 03:25 PM 发表
活动主分区、最后分区号与盘符的确定思路和批处理 ...



不明白为什么这么执着!
作者: starrysky    时间: 2007-5-31 17:23
通过关键字符串 “Disk:” 可以遍历出所有的磁盘,然后通过循环处理下面的 “磁盘号.n” 可以得到最后的分区。
作者: lianjiang    时间: 2007-5-31 20:59
原帖由 小咕咚 于 2007-5-31 03:15 PM 发表
使用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. ...


磁盘多不是问题。而是你到底想需要得到什么结果。
首先需要你确认以下信息:
最后分区是:
5.4: (   9.16GB) [N:\] Volume NTFS l:[YD01-03OK]
活动分区为:
  1.1: (  10.04GB) [C:\] Active Volume NTFS

对否?还是只找第一硬盘最后分区?
因为有时最后磁盘的最后分区可能没多大实际意义。
作者: 小咕咚    时间: 2007-6-2 17:15
我的意思是用批处理命令怎么写来确定第一块硬盘的最后分区!
作者: lianjiang    时间: 2007-6-2 17:20
原帖由 小咕咚 于 2007-6-2 05:15 PM 发表
我的意思是用批处理命令怎么写来确定第一块硬盘的最后分区!

参考1楼的思路即可。
作者: sjrw    时间: 2007-6-3 11:31
多谢了。。学习啦
作者: jie_china    时间: 2007-6-3 16:04
楼主强:lol :lol
作者: haohaodlam    时间: 2007-6-19 18:19
minito 兼容性不是很好 SATA和ATA混用的情况下ODS下运行死机 (已经加了-NOHP)参数
作者: lpic2003    时间: 2007-7-2 22:18
谢谢!留下来看看.
还不够字!哈哈
作者: lianjiang    时间: 2007-7-2 22:24
批处理只是提供一种方法和思路,仅供参考。
我也发现minito兼容性不佳,已经放弃,gghost中早已改用dspt了。
作者: willsion    时间: 2007-7-11 00:11
原帖由 lianjiang 于 2007-7-2 10:24 PM 发表
批处理只是提供一种方法和思路,仅供参考。
我也发现minito兼容性不佳,已经放弃,gghost中早已改用dspt了。


lianjiang大虾,dspt有windows版本吗?

能否提供一个,谢谢了。
作者: lianjiang    时间: 2007-7-11 08:26
原帖由 willsion 于 2007-7-11 12:11 AM 发表


lianjiang大虾,dspt有windows版本吗?

能否提供一个,谢谢了。

目前是测试版,我的网盘有下载,无限制。『dsptw_test_win32 目录中』,无需密码。
据作者说,若无bug报告的话,7月15日日后将发布正式版。
马上就会出正式版了。
作者: lianjiang    时间: 2007-7-11 08:27
关于dspt的更多信息,请去dos联盟论坛查询。
作者: willsion    时间: 2007-7-11 09:11
原帖由 lianjiang 于 2007-7-11 08:26 AM 发表

目前是测试版,我的网盘有下载,无限制。『dsptw_test_win32 目录中』,无需密码。
据作者说,若无bug报告的话,7月15日日后将发布正式版。
马上就会出正式版了。


从您的网盘下载了测试版。

关注正式版发布时间。

谢谢了。

[ 本帖最后由 willsion 于 2007-7-11 09:14 AM 编辑 ]
作者: willsion    时间: 2007-7-31 10:56
利用dsptw.exe读取当前硬盘(第一硬盘)活动分区的au3脚本。
请各位大侠指正。


#include <process.au3>
#include <file.au3>

Dim $file1,$found,$i,$nline,$str

FileInstall("dsptw.exe",@ScriptDir & "\dsptw.exe",1)
_rundos( @ScriptDir & "\dsptw.exe 0 /l > " & @TempDir & "\partinfo.txt")
$nline=_FileCountLines(@TempDir & "\partinfo.txt")
$file1=FileOpen(@TempDir & "\partinfo.txt",0)
If $file1=-1 Then MsgBox(16,"错误","不能读取数据文件!")

For $i=6 to $nline+1 Step 1
   $str=FileReadLine($file1,$i)
   $found=StringInStr($str,"yes")
   if $found <> 0 Then ExitLoop
   Next

If $found = 0 Then
   MsgBox(48,"活动分区","当前硬盘没有活动分区!")
   Exit
Else
   msgbox(64,"活动分区","当前硬盘活动分区为" & StringMid($str,6,2) & " ")
EndIf

[ 本帖最后由 willsion 于 2007-7-31 11:12 AM 编辑 ]
作者: lianjiang    时间: 2007-7-31 11:30
原帖由 willsion 于 2007-7-31 10:56 AM 发表
利用dsptw.exe读取当前硬盘(第一硬盘)活动分区的au3脚本。
请各位大侠指正。

dsptw已发布正式版。
作者: willsion    时间: 2007-7-31 15:29
原帖由 lianjiang 于 2007-7-31 11:30 AM 发表

dsptw已发布正式版。


我是从您的网盘上下载的0717版,应该是正式版了。
作者: lianjiang    时间: 2007-7-31 15:31
0717是正式版。。。。。。。。。
作者: LOL    时间: 2007-7-31 15:33
好像在本论坛也发过。。。。。。
作者: willsion    时间: 2007-7-31 16:27
读取机器硬盘活动分区AU3脚本修正版。

支持多个硬盘。

#include <process.au3>
#include <file.au3>
Dim $file1,$active,$i,$str
FileInstall("dsptw.exe",@ScriptDir & "\dsptw.exe",1)
_rundos( @ScriptDir & "\dsptw.exe /A /PDR > " & @TempDir & "\partinfo.txt")
$file1=FileOpen(@TempDir & "\partinfo.txt",0)
If $file1=-1 Then MsgBox(16,"错误","不能读取数据文件!")
$i=3
$str=FileReadLine($file1,$i)
Do
   $active=StringMid($str,9,1)
   If $active="A" Then ExitLoop
   $i=$i+1
   $str=FileReadLine($file1,$i)
   Until @error=-1
   
If $active<>"A" Then
MsgBox(48,"活动分区","当前机器硬盘没有活动分区!")
Else
msgbox(64,"活动分区","当前机器硬盘活动分区为" & StringLeft($str,2) & " ")
EndIf





欢迎光临 无忧启动论坛 (http://bbs.wuyou.net/) Powered by Discuz! X3.3