中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --
联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟
中国DOS联盟论坛
现在时间是 2026-09-06 10:41
47,812 主题排行 / 349,914 发帖 / 今日 0 篇 / 48,268 会员排行
DOS启动盘 & LOGO技术 (启动盘室) » 活动主分区、最后分区号与盘符的确定批处理
可打印版本  4,063 / 21
第1楼 lianjiang2004 发表于 2007-05-09 07:51
金牌会员 发帖 1,884 积分 3,946
活动主分区、最后分区号与盘符的确定批处理
活动主分区、最后分区号与盘符的确定批处理

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 ]
第2楼 adiwdmd 发表于 2007-05-10 09:13
初级用户 发帖 15 积分 50
批处理有问题。
有没有考虑过分区数超过10个的情况?
第3楼 lianjiang2004 发表于 2007-05-10 09:46
金牌会员 发帖 1,884 积分 3,946
确实没有考虑这么多分区的问题。有缺陷。
谢谢指正。

[ Last edited by lianjiang2004 on 2007-5-10 at 10:08 AM ]
第4楼 lianjiang2004 发表于 2007-05-10 09:53
金牌会员 发帖 1,884 积分 3,946
需要处理10个分区的,稍微改一下一楼的批处理即可。
第5楼 lianjiang2004 发表于 2007-05-10 10:16
金牌会员 发帖 1,884 积分 3,946
1楼的批处理已修改过,已能处理10个以上分区。
第6楼 terse 发表于 2007-05-11 23:16
银牌会员 发帖 946 积分 2,404
rem strings lines=add %lines%,1 这行的 rem 怎么没去掉?
第7楼 lianjiang2004 发表于 2007-05-12 08:11
金牌会员 发帖 1,884 积分 3,946
Originally posted by terse at 2007-5-11 23:16:
rem strings lines=add %lines%,1 这行的 rem 怎么没去掉?

这行不需要了。删除即可。
原来用了行数来判断结束,现在改成无数据为结束了。不再需要。
第8楼 terse 发表于 2007-05-12 11:19
银牌会员 发帖 946 积分 2,404
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楼 lianjiang2004 发表于 2007-05-12 12:36
金牌会员 发帖 1,884 积分 3,946
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
第10楼 terse 发表于 2007-05-12 13:11
银牌会员 发帖 946 积分 2,404
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楼 lianjiang2004 发表于 2007-05-12 13:23
金牌会员 发帖 1,884 积分 3,946
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行是不处理的,所以会少一行。
因此需要加上一行,就不会少了。
我现在不用行数判断,直接用读取的该行是否有数据来判断。没数据就结束。就不需要考虑加行数问题了。
第12楼 terse 发表于 2007-05-12 14:23
银牌会员 发帖 946 积分 2,404
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楼 lianjiang2004 发表于 2007-05-12 14:49
金牌会员 发帖 1,884 积分 3,946
把你的hdisk.txt文件格式贴出来看看。

另“type %temp%\hdisk.ini | lmod /L2* [3] ” 没用过,请教 lmod什么意思?
第14楼 lianjiang2004 发表于 2007-05-12 15:25
金牌会员 发帖 1,884 积分 3,946
用你的批处理试了一下,确实要少一行,2行的就显示1行,一个硬盘的话,不加1,就是0了。呵呵。
我的minito生成文件没事,能正常使用。看了gdisk生成文件与minito的文件差别是minito的文件后要多一空行。
第15楼 terse 发表于 2007-05-12 15:35
银牌会员 发帖 946 积分 2,404
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 ]
1 2  下一页
[ 联系联盟系统管理团队 - 中国DOS联盟 - 标准版 ]
Sponsored by ifanr Inc | © 2001–2023