中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

中国DOS联盟论坛
现在时间是 2026-06-17 14:17
中国DOS联盟论坛 » DOS启动盘 & LOGO技术 (启动盘室) » 活动主分区、最后分区号与盘符的确定批处理 查看 3,754 回复 21
楼 主 活动主分区、最后分区号与盘符的确定批处理 发表于 2007-05-09 07:51 ·  中国 安徽 马鞍山 电信
金牌会员
★★★★
积分 3,946
发帖 1,884
注册 2006-01-20 13:00
UID 49283
性别 男
状态 离线
活动主分区、最后分区号与盘符的确定批处理

ghost自动备份时,活动主分区、最后分区号与盘符的确定思路和批处理


使用了第三方软件minito(for dos)。
【说明,本人水平有限,相信有更好的处理办法。欢迎批评指正】

DOS下解决方案。

所需工具:minito,strings,ifs

一,思路
1,用minitow获得硬盘信息。
由于可能要在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

2,对上面的信息进行处理,获得活动主分区,及最后分区和最后分区对应的盘符。

二,批处理。【已能处理10个以上分区的情况。】

@echo off
:BEGIN
set actp=
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 fail
rem strings lines=add %lines%,1
set line=1
echo 硬盘信息:
:mini
strings line=add %line%,1
rem if %line%#==%lines%# goto mini_1
strings lined=read mini_dd.txt,%line%
if %lined%#==# goto mini_1
strings row0=mid %lined%,4,1
if %row0%#==# goto mini_2
strings row1=left %lined%,4
goto mini_3
:mini_2
strings row1=left %lined%,3
:mini_3
strings row3=mid %lined%,8,2
strings row5=mid %lined%,19,3
if not %actp%#==# goto mini_4
if not %row5%#==YES# goto mini_4
set actp=%row1%
:mini_4
set lastp=%row1%
set lastd=%row3%
echo %lined%
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

[ Last edited by lianjiang2004 on 2007-5-12 at 01:07 PM ]
Windows 一键还原
http://www.yjhy.com
2 发表于 2007-05-10 09:13 ·  中国 安徽 淮南 电信
初级用户
积分 50
发帖 15
注册 2005-10-02 01:15
UID 43053
状态 离线
批处理有问题。
有没有考虑过分区数超过10个的情况?
3 发表于 2007-05-10 09:46 ·  中国 安徽 马鞍山 电信
金牌会员
★★★★
积分 3,946
发帖 1,884
注册 2006-01-20 13:00
UID 49283
性别 男
状态 离线
确实没有考虑这么多分区的问题。有缺陷。
谢谢指正。

[ Last edited by lianjiang2004 on 2007-5-10 at 10:08 AM ]
Windows 一键还原
http://www.yjhy.com
4 发表于 2007-05-10 09:53 ·  中国 安徽 马鞍山 电信
金牌会员
★★★★
积分 3,946
发帖 1,884
注册 2006-01-20 13:00
UID 49283
性别 男
状态 离线
需要处理10个分区的,稍微改一下一楼的批处理即可。
Windows 一键还原
http://www.yjhy.com
5 发表于 2007-05-10 10:16 ·  中国 安徽 马鞍山 电信
金牌会员
★★★★
积分 3,946
发帖 1,884
注册 2006-01-20 13:00
UID 49283
性别 男
状态 离线
1楼的批处理已修改过,已能处理10个以上分区。
Windows 一键还原
http://www.yjhy.com
6 发表于 2007-05-11 23:16 ·  中国 江苏 常州 溧阳市 电信
银牌会员
★★★
积分 2,404
发帖 946
注册 2005-09-08 13:44
UID 42345
状态 离线
rem strings lines=add %lines%,1 这行的 rem 怎么没去掉?
7 发表于 2007-05-12 08:11 ·  中国 安徽 马鞍山 电信
金牌会员
★★★★
积分 3,946
发帖 1,884
注册 2006-01-20 13:00
UID 49283
性别 男
状态 离线
Originally posted by terse at 2007-5-11 23:16:
rem strings lines=add %lines%,1 这行的 rem 怎么没去掉?

这行不需要了。删除即可。
原来用了行数来判断结束,现在改成无数据为结束了。不再需要。
Windows 一键还原
http://www.yjhy.com
8 发表于 2007-05-12 11:19 ·  中国 江苏 常州 溧阳市 电信
银牌会员
★★★
积分 2,404
发帖 946
注册 2005-09-08 13:44
UID 42345
状态 离线
Originally posted by lianjiang2004 at 2007-5-12 08:11:

这行不需要了。删除即可。
原来用了行数来判断结束,现在改成无数据为结束了。不再需要。

RE:lianjiang2004
gdisk >%temp%\hdisk.ini
type %temp%\hdisk.ini | lmod /L2* >%temp%\hdisk.txt
strings hn=linesize %temp%\hdisk.txt
strings hn=add %hn%,1
%hn%硬盘数
难道是strings版本的问题!
我这里没strings hn=add %hn%,1这一步不行!

在单硬盘的时候 如去掉 strings hn=add %hn%,1 这行 %hn%=0
加上hn=add %hn%,1 这行 %hn%=1

你上面的:
strings lines=LINESIZE mini_dd.txt
if %lines%#==0# goto fail
rem strings lines=add %lines%,1
按我这里的情况不用 strings lines=add %lines%,1 应该处理不了最后一个分区吧?

[ Last edited by terse on 2007-5-12 at 11:21 AM ]
9 发表于 2007-05-12 12:36 ·  中国 安徽 马鞍山 电信
金牌会员
★★★★
积分 3,946
发帖 1,884
注册 2006-01-20 13:00
UID 49283
性别 男
状态 离线
Originally posted by terse at 2007-5-12 11:19:

RE:lianjiang2004
gdisk >%temp%\hdisk.ini
type %temp%\hdisk.ini | lmod /L2* >%temp%\hdisk.txt
strings hn=linesize %temp%\hdisk.txt
strings hn=add %hn%,1
%hn%硬盘数
难道是st ...


不好意思,我记得在修改支持10个以上分区时,修改了结束的判断条件,才发现1楼的没改。
即把 if %line%#==%lines%# goto mini_1
改成if %lined%#==# goto mini_1
Windows 一键还原
http://www.yjhy.com
10 发表于 2007-05-12 13:11 ·  中国 江苏 常州 溧阳市 电信
银牌会员
★★★
积分 2,404
发帖 946
注册 2005-09-08 13:44
UID 42345
状态 离线
Originally posted by lianjiang2004 at 2007-5-12 12:36:


不好意思,我记得在修改支持10个以上分区时,修改了结束的判断条件,才发现1楼的没改。
即把 if %line%#==%lines%# goto mini_1
改成if %lined%#==# goto mini_1

呵呵~
我不是这个意思,
我想请教的是: 如果不用strings lines=add %lines%,1 那么%lines%总会比实践行数少1;
11 发表于 2007-05-12 13:23 ·  中国 安徽 马鞍山 电信
金牌会员
★★★★
积分 3,946
发帖 1,884
注册 2006-01-20 13:00
UID 49283
性别 男
状态 离线
Originally posted by terse at 2007-5-12 13:11:

呵呵~
我不是这个意思,
我想请教的是: 如果不用strings lines=add %lines%,1 那么%lines%总会比实践行数少1;

实际上行数并没少,这是由于判断条件的位置问题。
比如文件9行,8行处理完,就转回去,执行8+1,假如这时就判断行数是9就结束的话(即if %line%#==%lines%# goto mini_1),那么9行是不处理的,所以会少一行。
因此需要加上一行,就不会少了。
我现在不用行数判断,直接用读取的该行是否有数据来判断。没数据就结束。就不需要考虑加行数问题了。
Windows 一键还原
http://www.yjhy.com
12 发表于 2007-05-12 14:23 ·  中国 江苏 常州 溧阳市 电信
银牌会员
★★★
积分 2,404
发帖 946
注册 2005-09-08 13:44
UID 42345
状态 离线
Originally posted by lianjiang2004 at 2007-5-12 13:23:

实际上行数并没少,这是由于判断条件的位置问题。...

我这里不是这样的!
strings hn=linesize %temp%\hdisk.txt
echo %hn%
hdisk.txt如果是一行的话,那%hn%怎么会是0
strings hn=linesize %temp%\hdisk.txt
strings hn=add %hn%,1
hdisk.txt同样一行 这样的话%hn%就会是1
13 发表于 2007-05-12 14:49 ·  中国 安徽 马鞍山 电信
金牌会员
★★★★
积分 3,946
发帖 1,884
注册 2006-01-20 13:00
UID 49283
性别 男
状态 离线
把你的hdisk.txt文件格式贴出来看看。

另“type %temp%\hdisk.ini | lmod /L2* [3] ” 没用过,请教 lmod什么意思?
Windows 一键还原
http://www.yjhy.com
14 发表于 2007-05-12 15:25 ·  中国 安徽 马鞍山 电信
金牌会员
★★★★
积分 3,946
发帖 1,884
注册 2006-01-20 13:00
UID 49283
性别 男
状态 离线
用你的批处理试了一下,确实要少一行,2行的就显示1行,一个硬盘的话,不加1,就是0了。呵呵。
我的minito生成文件没事,能正常使用。看了gdisk生成文件与minito的文件差别是minito的文件后要多一空行。
Windows 一键还原
http://www.yjhy.com
15 发表于 2007-05-12 15:35 ·  中国 江苏 常州 溧阳市 电信
银牌会员
★★★
积分 2,404
发帖 946
注册 2005-09-08 13:44
UID 42345
状态 离线
Originally posted by lianjiang2004 at 2007-5-12 14:49:
把你的hdisk.txt文件格式贴出来看看。

另“type %temp%\hdisk.ini | lmod /L2* ” 没用过,请教 lmod什么意思?

hdisk.txt就是硬盘信息 是GDISK的
hdisk.ini内容 :
Disk Partitions Cylinders Heads Sectors Mbytes Model
1 6 9729 255 63 76319.1 UNKNOWN
lmod /L2* ”处理后的hdisk.txt内容:
1 6 9729 255 63 76319.1 UNKNOWN
lmod /L2* 就是从hdisk.ini文件第二排的第三字节写入hdisk.txt
我这样处理是因为如果有两个硬盘(尤其U盘被认第一硬盘) 就有个提示选择那个硬盘的
你上面的如果处理两个以上硬盘;可能就有出错的机会

[ Last edited by terse on 2007-5-12 at 03:43 PM ]
论坛跳转: