无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
查看: 5637|回复: 13
打印 上一主题 下一主题

[求助] 批处理取参数时,如何取指定的字符

[复制链接]
跳转到指定楼层
1#
发表于 2011-5-5 16:03:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
批处理取参数时,如何取指定的字符?

例  批处理名是 test
test hd0 /mbr
hd0  是批处理的第一个参数  如何取第一个参数的指定字符啊??

比如,要取从第一个开始到第二个,或者是从第二个开始到第三个。有办法做到啊?
2#
 楼主| 发表于 2011-5-5 16:32:20 | 只看该作者
看了下WENV可以做到。决定用WENV了。
回复

使用道具 举报

3#
发表于 2011-5-5 17:04:01 | 只看该作者
GRUB4DOS的批处理是仿CMD的批处理设计的。

批处理的%1就是第一个参数,%2就是第二个参数。。。最多%8,%9代表剩余的参数。

现在很多情况下都不需要使用WENV
回复

使用道具 举报

4#
 楼主| 发表于 2011-5-5 17:56:54 | 只看该作者
你上面说的我知道啊。我是取指定参数的指定字符。

比如第一个参数的 从0开始的几个字符。 不仅仅是为了取参数。是要取参数的具体符号。
回复

使用道具 举报

5#
发表于 2011-5-5 19:10:59 | 只看该作者
请在WINDOWS的CMD下输入set /?就可以看到解释,或置顶贴里面的最新版帮助文件应该也能看到相关资料。
回复

使用道具 举报

6#
 楼主| 发表于 2011-5-6 09:21:48 | 只看该作者
!BAT
if not exist debug set debug=off
debug %debug%
pager off
#判断相关文件是否已载到软驱
if exist (fd0)/mbr52 goto start
map --mem /BOOTLDR.IMG (fd0) || find --set-root /BOOTLDR.IMG && map --mem /BOOTLDR.IMG (fd0)
map --hook




#微软的工具 使用了严格的参数顺序检查,不能改变顺序,为了方便编程,决定采取相同的处理方法。
#微软的工具 第一个参数指定要更新的引导代码类型,第二个参数指定要更新的对象
#微软的工具 第二个参数必须是磁盘的盘符或者是启动分区,不能忽略掉
#微软的工具 不能忽略掉第二个参数,仅执行主引导的刷新操作,本工具决定做一下改动

# 本工具初步构想如下:
# 第一个参数用于指定引导代码,或者是指定清除扇区的操作
# 第一个参数为 clear 时 ,第二个参数必须指定硬盘 如 hd0  hd1 如果第二个参数为空 默认为hd0
# 第二个参数设定要进行操作的对象,可以是活动分区,指定分区,或者是MBR
# 第三个参数根据第二个参数来决定取值,如果第二个参数设定要对MBR进行操作则第三个参数必须指定硬盘
# 如果第二个参数指定为分区操作,则第三个参数/mbr为可选,即可以同时进行DBR跟MBR的操作
# 分区与磁盘的表示法: 采用GRUB4DOS的表示法,同样是为了简化编程

:start
if #%1==# goto help
if /i #%1==#clear goto cl162

:help
echo bootsect {/nt52|/nt60|clear} {sys|partition|/mbr} {disk|/mbr}
echo bootsect {/nt52|/nt60} /mbr {disk}
echo bootsect clear {disk}
echo bootsect {/nt52|/nt60} {sys|partition} [/mbr]
echo bootsect /nt52 (hd0,0)
echo bootsect /nt52 (hd0,0) /mbr
echo bootsect /clear (hd0)
echo bootsect /nt52 /mbr (hd0)
goto end

:cl162
if #%2==# set disk=(hd0) && goto qcks
debug on
set disk=%2 && set /a leng=*0x4cb00
if not #%leng%==#5 goto cs2cu
set csqz=%disk:~0,3%
if /i not #%csqz%==#(hd goto cs2cu
set csqz=%disk:~4,1%
if /i not #%csqz%==#) goto cs2cu

#参数二取值判断
cat --length=0 --hex %disk%+1 || goto cs2cu
:qcks
clear
echo Warning! %disk% 1-62 Sectors Will be Clear!
call sfjx
echo -n > %disk%1+62 && goto zxcg
goto zxsb


:sfjx
set /p JX=Do you want to continue? (y/n)
if /i not #%JX%==#y  goto end








:cs2cu
echo The disk value: %disk% is error!
echo The disk value: (hd0) (hd1)
echo bootsect clear (hd0)
goto end

:zxsb
echo Operation failed!
goto end
:zxcg
echo Operation completed successfully!

:end
pause Please Enter to Exit.
exit

暂时只写了上面的部分,但是发现有个错误,一直不知道是哪儿的原因。
回复

使用道具 举报

7#
 楼主| 发表于 2011-5-6 09:29:43 | 只看该作者
在执行过程中。 假如是这样 BOOTSECT CLEAR
第三个参数为空时,程序执行到让用户选择是否继续。如果选否 程序退出后,会有一个报错。 检查了好几遍,就是没找到问题的原因。

暂时对CALL还是不熟悉。我是希望,能够掌握CALL来减少代码。
但是发现如果是如下执行,在程序退出后就有报错。
bootsect clear
第三个参数为空,跳转到让用户 选择是否继续。 也就是使用CALL 调用 sfjx 标签时,如果用户选择了否,在退出时就会有报错。
Error 1: Filename must be either an absolute pathname or blocklist

使用 bootsect clear (hd0) 则不会出错。同意选否,则不会报错。
回复

使用道具 举报

8#
发表于 2011-5-6 09:46:49 | 只看该作者
echo -n > %disk%1+62 && goto zxcg

这个语句在执行的时候会先扩展%1,而不是%disk%

解决办法多加一个%
echo -n > %disk%%1+62 && goto zxcg

如果在批处理中碰到这样的情况就需要多加一个%
1-9,~,*都需要

这也是GRUB4DOS批处理和WINDOWS批处理的一个不同点。

WINDOWS的批处理会先扩展变量。而在GRUB4DOS中,为了节约代码还有方便编程,先扩展参数。变量要在执行的时候才会扩展。

[ 本帖最后由 chenall 于 2011-5-6 09:49 编辑 ]
回复

使用道具 举报

9#
发表于 2011-5-6 10:09:05 | 只看该作者
调试的时候,可以先debug on后再运行批处理来达到单步跟踪的目的

cat --length=0 --hex %disk%+1的目的是为了判别这个硬盘是否存在吗?
回复

使用道具 举报

10#
发表于 2011-5-6 10:47:51 | 只看该作者
if exist (0)/mbr52 goto :start
if not exist /BOOTLDR.IMG find --set-root /BOOTLDR.IMG
map --mem /BOOTLDR.IMG (fd0)
map --hook

if #%~1==# && goto :help
if /i %~1==clear && goto :cl162

:cl162
if #%~2==# set disk=(hd0) && goto qcks
set disk=%~2
if /i not %disk:~,3%==(hd goto :cs2cu
if /i not %disk:~-1%==) goto :cs2cu

:qcks
clear
echo Warning! %disk% 1-62 Sectors Will be Clear!
goto :sfjx
:_qcks
echo -n > %disk%%1+62 && goto :zxcg ! goto :zxsb

:sfjx
set /p JX=Do you want to continue? (y/n)
if /i %JX%==y && goto:_qcks ! if /i %JX%==n && goto :end
goto :sfjx

如果想让sfjx段公用的话可以这样

:qcks
clear
echo Warning! %disk% 1-62 Sectors Will be Clear!
set back=:_qcks && goto :sfjx
:_qcks
set back=
echo -n > %disk%%1+62 && goto :zxcg ! goto :zxsb

:sfjx
set /p JX=Do you want to continue? (y/n)
if /i %JX%==y && goto %back% ! if /i %JX%==n && goto :end
goto :sfjx


CALL 调用 sfjx 标签时,如果用户选择了否,在退出时就会有报错

这个可能是因为执行完 sfjz 段后返回原处继续向下执行了  即继续执行了"echo -n > %disk%1+62 && goto zxcg"一行

[ 本帖最后由 sratlf 于 2011-5-6 11:26 编辑 ]
回复

使用道具 举报

11#
 楼主| 发表于 2011-5-6 11:12:53 | 只看该作者
原帖由 zhaohj 于 2011-5-6 10:09 发表
调试的时候,可以先debug on后再运行批处理来达到单步跟踪的目的

cat --length=0 --hex %disk%+1的目的是为了判别这个硬盘是否存在吗?

是啊。就是为了测试目标硬盘是否存在。不存在就出错了。看了大侠的语句,受益良多啊。继续编去。太棒了。
回复

使用道具 举报

12#
 楼主| 发表于 2011-5-6 11:30:47 | 只看该作者
:sfjx
set /p JX=Do you want to continue? (y/n)
if /i %JX%==y && goto:XXX ! if /i %JX%==n && goto end
goto :sfjx

其中第三行中的 goto:XXX    XXX 指的是标签吧???? 如果用这种方法的话,那就只能调用一次了??? 我是想其它的也可以调用这个标签,是不是得另一个变量才行?
回复

使用道具 举报

13#
发表于 2011-5-6 11:35:02 | 只看该作者

回复 #12 sgw888 的帖子

10#帖子已重新编辑  提前通过变量设置好要返回何处

如果想让sfjx段公用的话可以这样

:qcks
clear
echo Warning! %disk% 1-62 Sectors Will be Clear!
set back=:_qcks && goto :sfjx
:_qcks
set back=
echo -n > %disk%%1+62 && goto :zxcg ! goto :zxsb

:sfjx
set /p JX=Do you want to continue? (y/n)
if /i %JX%==y && goto %back% ! if /i %JX%==n && goto :end
goto :sfjx
回复

使用道具 举报

14#
 楼主| 发表于 2011-5-6 16:39:26 | 只看该作者
已经加以改进,刷新主引导的部分已经完成。 目前正在解决分区引导的部分。因为分区牵涉到分区格式的问题。要用较多的代码,可能用到上个程序的部分代码。 正在编写中。。。 我会尽快写完。
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-11-30 10:45

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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