无忧启动论坛

 找回密码
 注册
搜索
WEPE笔记本电脑手机维修小包 IT发烧友的必备工具最纯净的「微PE装机优盘」UEPON大师作品卡瑞飞系统和装机二合一超级U盘
无忧启动论坛唯一网址:bbs.wuyou.net系统gho:最纯净好用系统下载站广告联系 QQ:184822951 微信:wuyouceo
楼主: sgw888

[发布] 基于GRUB4DOS的BOOTSECT

[复制链接]
发表于 2011-5-10 10:02:02 | 显示全部楼层
怎样优化,我举例一下:
checkrange 0x80 calc *0x401be&0xff && set cpfq=(hd0,0) && goto :_fqdqjc
checkrange 0x80 calc *0x401ce&0xff && set cpfq=(hd0,1) && goto :_fqdqjc
checkrange 0x80 calc *0x401de&0xff && set cpfq=(hd0,2) && goto :_fqdqjc
checkrange 0x80 calc *0x401ee&0xff && set cpfq=(hd0,3) && goto :_fqdqjc
goto :noap

:_fqdqjc
#检查分区是否可以访问
echo
echo The Activate Partition : %cpfq%
cat --length=0 --hex %cpfq%+1 || goto :fqdqcw
goto :_fqgs
==========改成========
set cpfq=
checkrange 0x80 calc *0x401be&0xff && set cpfq=(hd0,0)
checkrange 0x80 calc *0x401ce&0xff && set cpfq=(hd0,1)
checkrange 0x80 calc *0x401de&0xff && set cpfq=(hd0,2)
checkrange 0x80 calc *0x401ee&0xff && set cpfq=(hd0,3)
set cpfq || set err=1 && goto :err
:检查分区是否可以访问
echo
cat --length=0  %cpfq%+1 || set err=2 && goto :err
echo The Activate Partition : %cpfq% may be access!
goto :_fqgs
.....
错误处理用变量代替,统一用err
:err
if %err%==1 ....
if %err%==2 ....
回复

使用道具 举报

发表于 2011-5-10 12:27:45 | 显示全部楼层
原帖由 sgw888 于 2011-5-10 08:53 发表
根据CHENALL 提示,只修复一处BUG。

另外,CHENALL 有些地方,改的地方,我看不懂。 从内存中取变量值的方法。实在搞不懂。


####pause 会返回按键的ASCII码。
pause Do you want to continue? (y/n)
#获取按键字母并转为大写。Y=89,N=78
set /a JX=*0x4CB00 & 0xdf
if %JX%==89 && exit
if %JX%==78 && goto :end
goto :_SFJX
####上面也可以用以下方法,直接从内存中取出该字符####
cat --length=1 --skip=0x100 (md)0x265+1 | set JX=
if /i "%JX%"=="y" && exit
if /i "%JX%"=="n" && goto :end

我解释一下,这个应该很容易明白的。

1.首先pause可以返回按键的ASCII码。比如按建Y的ASCII码为 89(大写)或121(小写)
  在内存中是十六进制数0x59或0x79用字符显示的字符是Y或y
2.内存中0x4cb00存放的是上一个命令的返回值。
3.第一种方法直接取这个按键的值和0xdf进行与操作(也是小写转大写的方法)
  比如: 大小写状态下按了Y键,而内存中的值是0x79
0x79   01111001

0xdf    11011111
-------------------------
0x59    01011001

4.第二种方法是直接取按键的字符
其中(md)0x265+1就是0x265*512开始的1个扇区=0x4CA00
--skip=0x100就是从上面的偏移0x100处开始显示字符即0x4cb00
--length=1 只显示一个字符。
| set JX=   把这个字符设为一个变量JX
回复

使用道具 举报

 楼主| 发表于 2011-5-10 14:24:31 | 显示全部楼层
不错,我明白了。你一解释我就明白了。抽个时间看能不能优化一下。还有 zhaohj 说的那些也有道理。  我得抽时间,把代码优化一下。 看起来条理一些就好了。
回复

使用道具 举报

发表于 2011-5-10 17:12:40 | 显示全部楼层
太好了 正需要这个东西 感谢lz
回复

使用道具 举报

 楼主| 发表于 2011-5-10 17:24:00 | 显示全部楼层
以下代码请帮助看一下:

# 想把磁盘跟分区的参数输入检查代码合到一块,做一个公共代码
# 设置了一个变量csqzbz,用于调用时判断是检查 磁盘参数还是分区参数
# 输入检查,调用 :_cssrjc
# 说明,此处把整个批处理的第二个参数赋值给变量 cpfq
set cpfq=%2 && set csqzbz=partition && call  :_cssrjc %cpfq%
if %jccg%==no goto :_2help
# 下面是继续执行的代码....
#以下为公共代码
:_cssrjc
set jcjg=
set csqz=%1 && set /a leng=*0x4cb00
#检查参数输入是磁盘还是分区
if /i %csqzbz%==partition && if not #%leng%==#7 set jccg=no
if /i %csqzbz%==disk && if not #%leng%==#5 set jccg=no
if /i not %csqz:~,3%==(hd set jccg=no
if /i not %cpfq:~-1%==) set jccg=no
if not exist jccg set jccg=yes


请帮忙给点意见,优化一下。

[ 本帖最后由 sgw888 于 2011-5-10 17:27 编辑 ]
回复

使用道具 举报

发表于 2011-5-10 17:49:26 | 显示全部楼层
查找是否包含“,”来区分是是磁盘还是分区
set cpfq=%2
echo %cpfq% > (md)0x300+1
cat --locate=, (md)0x300+1 | set a=
set a && echo %cpfq% is partition ! echo %cpfq% is disk

当然严格点需要再检查前面是否是(hd开头及最后是否是)结尾

[ 本帖最后由 zhaohj 于 2011-5-10 17:52 编辑 ]
回复

使用道具 举报

 楼主| 发表于 2011-5-10 20:02:29 | 显示全部楼层
可能我上面没有表达明白。 第一部分为调用部分,第二部分为公共代码。
我想把磁盘跟分区参数的输入合并为一个公共部分。

然后,其它地方需要检查参数的 都 去调用这个 公共部分。

调用公共部分的时候,可以用 call 吧。可是 程序执行到哪儿才会 返来原来的地方呢?? 是遇到下一个标签 吗???
回复

使用道具 举报

发表于 2011-5-10 20:58:06 | 显示全部楼层
原帖由 sgw888 于 2011-5-10 20:02 发表
可能我上面没有表达明白。 第一部分为调用部分,第二部分为公共代码。
我想把磁盘跟分区参数的输入合并为一个公共部分。

然后,其它地方需要检查参数的 都 去调用这个 公共部分。

调用公共部分的时候,可 ...


CALL调用和GOTO调用执行的流程是一样的。

只不过CALL会返回,而GOTO不会返回。

另外CALL可以附加参数,GOTO不行。

至于返回
1.到文件尾自然会返回。
2.碰到exit 也会返回。

所以一般用call调用的标签尾部都会有exit命令或goto :eof(或类似的命令让它返回).
回复

使用道具 举报

发表于 2011-5-11 11:09:35 | 显示全部楼层
支持支持,有这个就好了,微软的好像不支持GrUB,我的PE在win7系统上打不开
回复

使用道具 举报

 楼主| 发表于 2011-5-11 22:13:05 | 显示全部楼层
如果在CALL 调用的过程中,想直接退出整个批处理,该怎么做?? 有时候,在CALL 调用的时候。希望可以直接退出整个批处理。不再希望返回到原处,可以做到吗?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2019-12-9 16:53

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表