无忧启动论坛

标题: 批处理取参数时,如何取指定的字符 [打印本页]

作者: sgw888    时间: 2011-5-5 16:03
标题: 批处理取参数时,如何取指定的字符
批处理取参数时,如何取指定的字符?

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

比如,要取从第一个开始到第二个,或者是从第二个开始到第三个。有办法做到啊?
作者: sgw888    时间: 2011-5-5 16:32
看了下WENV可以做到。决定用WENV了。
作者: chenall    时间: 2011-5-5 17:04
GRUB4DOS的批处理是仿CMD的批处理设计的。

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

现在很多情况下都不需要使用WENV
作者: sgw888    时间: 2011-5-5 17:56
你上面说的我知道啊。我是取指定参数的指定字符。

比如第一个参数的 从0开始的几个字符。 不仅仅是为了取参数。是要取参数的具体符号。
作者: chenall    时间: 2011-5-5 19:10
请在WINDOWS的CMD下输入set /?就可以看到解释,或置顶贴里面的最新版帮助文件应该也能看到相关资料。
作者: sgw888    时间: 2011-5-6 09:21
!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

暂时只写了上面的部分,但是发现有个错误,一直不知道是哪儿的原因。
作者: sgw888    时间: 2011-5-6 09:29
在执行过程中。 假如是这样 BOOTSECT CLEAR
第三个参数为空时,程序执行到让用户选择是否继续。如果选否 程序退出后,会有一个报错。 检查了好几遍,就是没找到问题的原因。

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

使用 bootsect clear (hd0) 则不会出错。同意选否,则不会报错。
作者: chenall    时间: 2011-5-6 09:46
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 编辑 ]
作者: zhaohj    时间: 2011-5-6 10:09
调试的时候,可以先debug on后再运行批处理来达到单步跟踪的目的

cat --length=0 --hex %disk%+1的目的是为了判别这个硬盘是否存在吗?
作者: sratlf    时间: 2011-5-6 10:47
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 编辑 ]
作者: sgw888    时间: 2011-5-6 11:12
原帖由 zhaohj 于 2011-5-6 10:09 发表
调试的时候,可以先debug on后再运行批处理来达到单步跟踪的目的

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

是啊。就是为了测试目标硬盘是否存在。不存在就出错了。看了大侠的语句,受益良多啊。继续编去。太棒了。
作者: sgw888    时间: 2011-5-6 11:30
: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 指的是标签吧???? 如果用这种方法的话,那就只能调用一次了??? 我是想其它的也可以调用这个标签,是不是得另一个变量才行?
作者: sratlf    时间: 2011-5-6 11:35
标题: 回复 #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
作者: sgw888    时间: 2011-5-6 16:39
已经加以改进,刷新主引导的部分已经完成。 目前正在解决分区引导的部分。因为分区牵涉到分区格式的问题。要用较多的代码,可能用到上个程序的部分代码。 正在编写中。。。 我会尽快写完。




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