![]() |
中国DOS联盟-- 联合DOS 推动DOS 发展DOS --联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum |
| 游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟 |
|
中国DOS联盟论坛 现在时间是 2026-08-05 11:28 |
共 48,038 主题排行 / 350,123 发帖 / 今日 1 篇 / 48,251 会员排行 |
| DOS批处理 & 脚本技术(批处理室) » 如何取得字符行号和指定行号的字符【已解决】 |
| 可打印版本 1,992 / 15 |
| 第1楼 lianjiang2004 | 发表于 2007-07-31 00:12 |
| 金牌会员 发帖 1,884 积分 3,946 | |
|
如何取得字符行号和指定行号的字符【已解决】 如何取得指定字符所在的行号及指定行号的字符。
如何从格式如下的文本文件中获取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 ] |
|
| 第2楼 bjsh | 发表于 2007-07-31 00:15 |
| 银牌会员 发帖 621 积分 2,000 | |
|
提示:findstr /n .* 可以获取行号。
|
|
| 第3楼 lianjiang2004 | 发表于 2007-07-31 08:13 |
| 金牌会员 发帖 1,884 积分 3,946 | |
|
谢谢了,那如何获得指定行号的字符?
|
|
| 第4楼 slore | 发表于 2007-07-31 09:29 |
| 铂金会员 发帖 2,478 积分 5,212 | |
|
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 ] |
|
| 第5楼 bjsh | 发表于 2007-07-31 09:45 |
| 银牌会员 发帖 621 积分 2,000 | |
|
请说说此ID行相对于其它行而言,独一无二的特征,不说清楚的话,代码很难写。
|
|
| 第6楼 lianjiang2004 | 发表于 2007-07-31 10:35 |
| 金牌会员 发帖 1,884 积分 3,946 | |
|
能确定的特征就是位于grldr.mbr所在行的前两行。是否还有其它特征,目前不清楚。
问题缘由: 我写了个向vista启动项中添加grub4dos的批处理,现在想写个自动卸载的批处理,因此想要获得grub4dos项的id号,以便卸载。 现在使用的卸载方法是利用安装时保存的id号,问题是假如这个临时文件被删掉的话,卸载就麻烦些了,需手动输入id号。 也许有其他简便方法。我再看看bcdedit的帮助。 |
|
| 第7楼 lianjiang2004 | 发表于 2007-07-31 10:38 |
| 金牌会员 发帖 1,884 积分 3,946 | |
|
我没写过修改grldr的帖子,写过一个grub4dos初级教程。
卸载批处理内容也想加到初级教程中,这样内容就完整些了。 |
|
| 第8楼 lianjiang2004 | 发表于 2007-07-31 10:51 |
| 金牌会员 发帖 1,884 积分 3,946 | |
Originally posted by slore at 2007-7-31 09:29: 这个应不能确定,现在除了默认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 |
|
| 第9楼 qzwqzw | 发表于 2007-07-31 11:22 |
| 银牌会员 发帖 636 积分 2,343 | |
|
你的目的如果能用专有工具还是用专有工具好些
没有必要把很多事情都交给批处理 如果实在没有办法的话 再用批处理 从你的描述上来看 你是想删除菜单中的grub4dos 那你只要将Grub 4 dos段所在的6行删除就可以了 (或者还需要处理别的东西) 这方法就很多了 可以先缓存六行文本到一个队列中 然后判断最新的行文本中是否包含grub4dos字段 如果有那么将队列清空 否则将队列更新 并将队列里退出的文本写到新的菜单文件中 最后将队列全部转移到新菜单中即可 或者采用定位的办法 先确定grub4dos的行号 再-5得到grub段首行的行号 然后用for+more根据段首尾行号过滤文本即可 |
|
| 第10楼 lianjiang2004 | 发表于 2007-07-31 11:23 |
| 金牌会员 发帖 1,884 积分 3,946 | |
|
下面是我用的笨办法取得的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 |
|
| 第11楼 qzwqzw | 发表于 2007-07-31 11:42 |
| 银牌会员 发帖 636 积分 2,343 | |
|
看来你还是想获取ID号
我不知道这样有什么好处 不知既然你这样定了 那我不再过多干涉 这个算法上应该没有什么问题 另外,关于ID的存储位置 不知道Vista下有没有类似boot.ini的支持注释的文本形式的系统文件 这样以注释形式将grub4dos的id号写在这个文本中 既便于提取,又不会轻易被删除 |
|
| 第12楼 Runas | 发表于 2007-07-31 11:45 |
| 初级用户 发帖 38 积分 74 | |
|
AWK
|
|
| 第13楼 lianjiang2004 | 发表于 2007-07-31 12:21 |
| 金牌会员 发帖 1,884 积分 3,946 | |
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的系统备份工具时,不能自动处理,将会很麻烦。 |
|
| 第14楼 slore | 发表于 2007-07-31 12:41 |
| 铂金会员 发帖 2,478 积分 5,212 | |
|
@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 |
|
| 第15楼 lianjiang2004 | 发表于 2007-07-31 14:17 |
| 金牌会员 发帖 1,884 积分 3,946 | |
|
谢谢,很简洁。
|
|
| 1 2 下一页 |
|
[ 联系联盟系统管理团队 -
中国DOS联盟 -
标准版 ] Sponsored by ifanr Inc | © 2001–2023 |