中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 如何取得字符行号和指定行号的字符【已解决】
« [1] [2] »
作者:
标题: 如何取得字符行号和指定行号的字符【已解决】 上一主题 | 下一主题
lianjiang2004
金牌会员





积分 3946
发帖 1884
注册 2006-1-20
状态 离线
『楼 主』:  如何取得字符行号和指定行号的字符【已解决】

如何取得指定字符所在的行号及指定行号的字符。

如何从格式如下的文本文件中获取grldr.mbr项的ID号,即本例的“{62fe0a1a-3eb3-11dc-9284-00e04c75ef59}”。
说明,1,此ID号字符不是固定的,但格式不变。
      2,grldr.mbr项不一定是最后一个项目。

      个人思路,首先确定grldr.mbr项所在行,减2行,得到ID号所在行。然后处理字符。
      就是不知道如何取得ID号所在行。
      谢谢。


Windows Boot Manager
--------------------
identifier              {bootmgr}
device                  unknown
description             Windows Boot Manager
locale                  zh-CN
inherit                 {globalsettings}
default                 {default}
displayorder            {default}
                        {62fe0a1a-3eb3-11dc-9284-00e04c75ef59}
toolsdisplayorder       {memdiag}
timeout                 5

Windows Boot Loader
-------------------
identifier              {default}
device                  unknown
path                    \Windows\system32\winload.exe
description             Windows Vista (TM) Ultimate (已恢复)
osdevice                unknown
systemroot              \Windows
resumeobject            {72e1ad73-cc8f-11db-aef5-806e6f6e6963}

Real-mode Boot Sector
---------------------
identifier              {62fe0a1a-3eb3-11dc-9284-00e04c75ef59}
device                  boot
path                    \grldr.mbr
description             Grub 4 dos

[ Last edited by lianjiang2004 on 2007-7-31 at 06:29 PM ]



Windows 一键还原
http://www.yjhy.com
2007-7-31 00:12
查看资料  发短消息 网志   编辑帖子  回复  引用回复
bjsh
银牌会员





积分 2000
发帖 621
注册 2007-1-1
状态 离线
『第 2 楼』:  

  提示:findstr /n .* 可以获取行号。

2007-7-31 00:15
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
lianjiang2004
金牌会员





积分 3946
发帖 1884
注册 2006-1-20
状态 离线
『第 3 楼』:  

谢谢了,那如何获得指定行号的字符?



Windows 一键还原
http://www.yjhy.com
2007-7-31 08:13
查看资料  发短消息 网志   编辑帖子  回复  引用回复
slore
铂金会员





积分 5212
发帖 2478
注册 2007-2-8
状态 离线
『第 4 楼』:  

identifier是否除了ID就是{bootmgr} ,{default}?
那就简单多了……

2次findstr

第一次过滤有identifier的行
第二次过滤没有{bootmgr},{default}的行


硬是要上面的方法也不是不可以……麻烦点。


注意到有个ID,但是前面没有说明词,数了下是24个空格,所以:

findstr /c:"                        " 1.txt
pause

你的文本比较少不知道是不是都这样……



lianjiang这个ID见过嗬,你写过几个修改grldr的帖子,看着改了些东西嗬。

[ Last edited by slore on 2007-7-31 at 09:37 AM ]

2007-7-31 09:29
查看资料  发短消息 网志   编辑帖子  回复  引用回复
bjsh
银牌会员





积分 2000
发帖 621
注册 2007-1-1
状态 离线
『第 5 楼』:  

  请说说此ID行相对于其它行而言,独一无二的特征,不说清楚的话,代码很难写。

2007-7-31 09:45
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
lianjiang2004
金牌会员





积分 3946
发帖 1884
注册 2006-1-20
状态 离线
『第 6 楼』:  

能确定的特征就是位于grldr.mbr所在行的前两行。是否还有其它特征,目前不清楚。

问题缘由:
     我写了个向vista启动项中添加grub4dos的批处理,现在想写个自动卸载的批处理,因此想要获得grub4dos项的id号,以便卸载。
     现在使用的卸载方法是利用安装时保存的id号,问题是假如这个临时文件被删掉的话,卸载就麻烦些了,需手动输入id号。

也许有其他简便方法。我再看看bcdedit的帮助。



Windows 一键还原
http://www.yjhy.com
2007-7-31 10:35
查看资料  发短消息 网志   编辑帖子  回复  引用回复
lianjiang2004
金牌会员





积分 3946
发帖 1884
注册 2006-1-20
状态 离线
『第 7 楼』:  

我没写过修改grldr的帖子,写过一个grub4dos初级教程。
卸载批处理内容也想加到初级教程中,这样内容就完整些了。



Windows 一键还原
http://www.yjhy.com
2007-7-31 10:38
查看资料  发短消息 网志   编辑帖子  回复  引用回复
lianjiang2004
金牌会员





积分 3946
发帖 1884
注册 2006-1-20
状态 离线
『第 8 楼』:  



  Quote:
Originally posted by slore at 2007-7-31 09:29:
identifier是否除了ID就是{bootmgr} ,{default}?
那就简单多了……

这个应不能确定,现在除了默认vista项,就是grub4dos项,假如增加了其它项的话,应该出现类似的项目。

试着随便增加了一项NTLDR-2。麻烦各位看看。
-----------------------------------------------

Windows Boot Manager
--------------------
identifier              {bootmgr}
device                  unknown
description             Windows Boot Manager
locale                  zh-CN
inherit                 {globalsettings}
default                 {default}
displayorder            {default}
                        {62fe0a1a-3eb3-11dc-9284-00e04c75ef59}
                        {af700c0c-3f0f-11dc-9285-00e04c75ef59}
toolsdisplayorder       {memdiag}
timeout                 5

Windows Boot Loader
-------------------
identifier              {default}
device                  unknown
path                    \Windows\system32\winload.exe
description             Windows Vista (TM) Ultimate (已恢复)
osdevice                unknown
systemroot              \Windows
resumeobject            {72e1ad73-cc8f-11db-aef5-806e6f6e6963}

Real-mode Boot Sector
---------------------
identifier              {62fe0a1a-3eb3-11dc-9284-00e04c75ef59}
device                  boot
path                    \grldr.mbr
description             Grub 4 dos

Real-mode Boot Sector
---------------------
identifier              {af700c0c-3f0f-11dc-9285-00e04c75ef59}
device                  boot
path                    \ntldr
description             NTLDR-2



Windows 一键还原
http://www.yjhy.com
2007-7-31 10:51
查看资料  发短消息 网志   编辑帖子  回复  引用回复
qzwqzw
银牌会员

天的白色影子


积分 2342
发帖 635
注册 2004-3-6
状态 离线
『第 9 楼』:  

你的目的如果能用专有工具还是用专有工具好些
没有必要把很多事情都交给批处理

如果实在没有办法的话
再用批处理

从你的描述上来看
你是想删除菜单中的grub4dos

那你只要将Grub 4 dos段所在的6行删除就可以了
(或者还需要处理别的东西)
这方法就很多了

可以先缓存六行文本到一个队列中
然后判断最新的行文本中是否包含grub4dos字段
如果有那么将队列清空
否则将队列更新
并将队列里退出的文本写到新的菜单文件中
最后将队列全部转移到新菜单中即可

或者采用定位的办法
先确定grub4dos的行号
再-5得到grub段首行的行号
然后用for+more根据段首尾行号过滤文本即可

2007-7-31 11:22
查看资料  发短消息 网志   编辑帖子  回复  引用回复
lianjiang2004
金牌会员





积分 3946
发帖 1884
注册 2006-1-20
状态 离线
『第 10 楼』:  

下面是我用的笨办法取得的grldr.mbr项目的id号。请指教。
思路:
1,生成vista启动项目临时文件bcdtemp.txt,格式如上面的帖子。
2,取得grldr.mbr项目的行号。
3,减去3行得id号前一行号。
4,取得id号所在行的字符,处理后得到id号。

-----------------------------------------
@echo off
bcdedit >bcdtemp.txt
findstr /n grldr.mbr  bcdtemp.txt>nnn.txt
for,/f,"tokens=1 delims=:",%%i,In (nnn.txt) Do (
                 set nnn=%%i
        )
echo nnn is %nnn%.
set /a nnn2=%nnn%-3
echo nnn2 is %nnn2%.

setlocal EnableDelayedExpansion
for,/f,"skip=%nnn2% tokens=2",%%i,In (bcdtemp.txt) Do (
                 set vid=%%i
                 if not !vid!.==. echo vid is !vid!.&&pause&&echo !vid!>vidn.ini&&goto :exit
        )

:exit



Windows 一键还原
http://www.yjhy.com
2007-7-31 11:23
查看资料  发短消息 网志   编辑帖子  回复  引用回复
qzwqzw
银牌会员

天的白色影子


积分 2342
发帖 635
注册 2004-3-6
状态 离线
『第 11 楼』:  

看来你还是想获取ID号
我不知道这样有什么好处
不知既然你这样定了
那我不再过多干涉

这个算法上应该没有什么问题

另外,关于ID的存储位置
不知道Vista下有没有类似boot.ini的支持注释的文本形式的系统文件
这样以注释形式将grub4dos的id号写在这个文本中
既便于提取,又不会轻易被删除

2007-7-31 11:42
查看资料  发短消息 网志   编辑帖子  回复  引用回复
Runas
初级用户





积分 74
发帖 38
注册 2007-7-25
状态 离线
『第 12 楼』:  

AWK

2007-7-31 11:45
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
lianjiang2004
金牌会员





积分 3946
发帖 1884
注册 2006-1-20
状态 离线
『第 13 楼』:  



  Quote:
Originally posted by qzwqzw at 2007-7-31 11:22:
你的目的如果能用专有工具还是用专有工具好些
没有必要把很多事情都交给批处理

如果实在没有办法的话
再用批处理

从你的描述上来看
你是 ...

用删除行的方法是不行的,上面给出的文本,是导出的vista启动项,而并非vista启动文件本身,因此编辑这个文件是没用的。
通过批处理获取id号后,再根据vista菜单编辑的要求进行处理。

之所以考虑用批处理,是由于vista的启动项编辑比xp下编辑boot.ini要麻烦,用vista自带工具编辑,需要手动输入多次上面所示的随机产生的形如“{62fe0a1a-3eb3-11dc-9284-00e04c75ef59}”的id号,很麻烦。用批处理,能解决安装与卸载问题。

特别是在使用基于grub4dos和ghost的系统备份工具时,不能自动处理,将会很麻烦。



Windows 一键还原
http://www.yjhy.com
2007-7-31 12:21
查看资料  发短消息 网志   编辑帖子  回复  引用回复
slore
铂金会员





积分 5212
发帖 2478
注册 2007-2-8
状态 离线
『第 14 楼』:  

@echo off
for /f "tokens=1 delims=:" %%i In ('findstr /n grldr.mbr  bcdtemp.txt') Do (
                 Set nnn=%%i
        )
set /a nnn=%nnn%-2
findstr /n identifier bcdtemp.txt>temp.txt
for /f "tokens=2" %%i In ('findstr /n %nnn%:identifier temp.txt') Do (
echo %%i
)
pause

2007-7-31 12:41
查看资料  发短消息 网志   编辑帖子  回复  引用回复
lianjiang2004
金牌会员





积分 3946
发帖 1884
注册 2006-1-20
状态 离线
『第 15 楼』:  

谢谢,很简洁。



Windows 一键还原
http://www.yjhy.com
2007-7-31 14:17
查看资料  发短消息 网志   编辑帖子  回复  引用回复
« [1] [2] »
请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: