无忧启动论坛

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

GRUB4DOS更新建议、bug反馈专帖

    [复制链接]
跳转到指定楼层
1#
发表于 2010-11-5 18:03:03 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖主要为对grub4dos的建议,或是bug的反馈,问题请去问题专帖。          by  sratlf

===================================================================

cat命令的语法是这样的:
cat [--hex] [--skip=S] [--length=L] [--locate=STRING] [--locate-align=A] FILE

--locate=STRING :查找文件中指定字符串的位置,有几个就输出几个
如文件内容:
PCI$
$PCI\VEN_1000&DEV_0050=lsi_sas                  <----------占30+2个字节=0x20
$PCI\VEN_1000&DEV_0056=lsi_sas   
$PCI\VEN_1000&DEV_005A=lsi_sas
$PCI\VEN_1000&DEV_0062=lsi_sas
$PCI\VEN_1000&DEV_0054=lsi_sas
$PCI\VEN_1000&DEV_0058=lsi_sas
$PCI\VEN_1000&DEV_005E=lsi_sas
-----------
--locate=$PCI,会输出16进制的数值,用空格分开,上面回车换行占2个字节:
6 26 46 66 86 a6 c6


[--skip=S]  跳过多少字节开始,这里S是10进制数或16进制数

----------------------------------
问题1:--locate=STRING如果输出16进制,建议输出格式改成0x6 0x26 0x46 ...
问题2:--skip=S 与上面对应为16进制。
问题3:希望加个参数,STRING不分大小写
...

[ 本帖最后由 zhaohj 于 2010-11-11 09:48 编辑 ]

点评

辛苦了  发表于 2024-5-11 18:37
www.13958867733.com/info/XrEFcWfFXrE/ 庶女嫡妃  发表于 2015-3-26 18:15

评分

参与人数 1无忧币 +2 收起 理由
yyz2191958 + 2 赞一个!

查看全部评分

推荐
发表于 2010-11-6 19:14:06 | 只看该作者
原帖由 zhaohj 于 2010-11-6 16:14 发表


inifile  a:\txtsetup.oem [aaaa]>f6.tmp
DOS下就这么简单提取出了[aaaa]段落的内容


尽量运用现有的功能达到目的,避免重复开发,
我将批处理改了下,算是一个通用的外部命令了
用法:
WENV set INIFILE=INI文件 [段名]
GETSECT.BAT

GETSECT.rar (707 Bytes, 下载次数: 137)

目前只能在11-03版的grldr上运行(11-04以后的版本批处理有BUG,新版正常后批处理还可以简化,并且可以将通过参数指定一个文件名,将结果写入文件)



!BAT设置变量INIFILE=INI文件名 [段名],打印该段内容

:参数检查
WENV get INIFILE || kernel
WENV reset _ini_*

:文件名、段名
WENV set _ini_fn=${INIFILE% }
WENV set _ini_sc=${INIFILE## }

:保存当前debug状态,打开回显,否则管道命令可能失败
debug status | WENV set -t _ini_db= && WENV set _ini_db=${_ini_db## } && debug 1

:记录偏移1
WENV call cat --locate=${_ini_sc} ${_ini_fn} | WENV set -t _ini_s1=
WENV get _ini_s1 || WENV echo -e not found sect ${_ini_sc}\n && WENV call debug ${_ini_db} && WENV reset _ini_* && kernel
WENV set _ini_s1=0x${_ini_s1}
WENV check " "<-"${_ini_s1}" set _ini_s1=${_ini_s1%% }

:记录偏移2
WENV calc _ini_tmp=_ini_s1+1
WENV call cat --skip=${_ini_tmp} --locate=[ ${_ini_fn} | WENV set -t _ini_s2=
WENV set _ini_s2=0x${_ini_s2}
WENV check " "<-"${_ini_s2}" set _ini_s2=${_ini_s2%% }

:没有找到下一个段时,设置为文件长度
WENV check ${_ini_s2,?}==2 && WENV call cat --length=0 ${_ini_fn} | WENV set -t _ini_s2=
WENV check " "<-"${_ini_s2}" set _ini_s2=${_ini_s2## }

:起始位置, 字节计数
WENV calc _ini_s1=_ini_s1+${_ini_sc,?}
WENV calc _ini_s2=_ini_s2-_ini_s1

:直接显示, 首尾可能有换行(如果内容较短,可通过变量中转显示去掉首尾换行)
WENV call cat --skip=${_ini_s1} --length=${_ini_s2} ${_ini_fn}

:恢复环境
WENV call debug ${_ini_db}
WENV reset _ini_*
回复

使用道具 举报

推荐
 楼主| 发表于 2010-11-5 22:13:01 | 只看该作者
原帖由 chenall 于 2010-11-5 19:12 发表
我觉得这些不是很重要的东西尽量不要使用内部的命令去实现。

你可以把你最终想要得到的结果贴出来。
注:是最终的目的,而不是使用这个命令要达到的过程,也许会有更好的解决方案。

看看tuxw或zxw能不能 ...


[aaaa]
sgrhgjhm
zbgnhgj
[bbbb]
sytrhy
hnh
-------------------
我的目的很简单,如:INIFILE 文件名 [aaaa]
显示[aaaa]段录内容
回复

使用道具 举报

推荐
发表于 2010-11-5 21:18:08 | 只看该作者
@zhaohj
问题1

可以这样解决
cat --locate=... | WENV set a=
WENV set a=0x${a! = 0x}   # 最前面加上0x,然后将空格替换为空格0x

[ 本帖最后由 tuxw 于 2010-11-5 21:23 编辑 ]
回复

使用道具 举报

推荐
发表于 2010-11-5 19:12:01 | 只看该作者
我觉得这些不是很重要的东西尽量不要使用内部的命令去实现。

你可以把你最终想要得到的结果贴出来。
注:是最终的目的,而不是使用这个命令要达到的过程,也许会有更好的解决方案。

看看tuxw或zxw能不能想办法去实现。
回复

使用道具 举报

推荐
发表于 2010-11-6 19:40:03 | 只看该作者

1105bug

11-05 版批处理BUG

随便写一个简单的语句集合的批处理文件,运行正常

在中间任意位置加一句
WENV check 1==2 echo ok
再运行批处理将在这句后退出

应该是只要有一条语句返回0就终止了
比如插入 WENV calc 1-1 && WENV echo ok 也一样
回复

使用道具 举报

推荐
发表于 2010-11-6 19:22:03 | 只看该作者
我比较希望的用法是这样的
WENV read GetSect.env inifile [aaaa]
回复

使用道具 举报

推荐
 楼主| 发表于 2010-11-6 16:14:26 | 只看该作者
原帖由 tuxw 于 2010-11-6 15:59 发表
可以先查找 [aaaa] 再查找 [
如果  不可预知,用 INIFILE 的方式更不可能实现,INI 是必须要知道段名和变量名才可以操作的


inifile  a:\txtsetup.oem [aaaa]>f6.tmp
DOS下就这么简单提取出了[aaaa]段落的内容
回复

使用道具 举报

9#
发表于 2010-11-5 22:26:38 | 只看该作者
可以用 WENV 命令实现,只是步骤麻烦了点

!BAT
:记录偏移1
cat --locate=[aaaa] /T.TXT | WENV set s1=
WENV set s1=0x${s1}
WENV check " "<-"${s1}" set s1=${s1%% }

:记录偏移2
cat --locate=[bbbb] /T.TXT | WENV set s2=
WENV set s2=0x${s2}
WENV check " "<-"${s2}" set s2=${s2%% }

:如果查找次序相反,交换偏移量,保证s1在前面

:交换方法1: 大文件时加法有可能计算溢出
:WENV check ${s1}>=${s2} (calc s1=s1+s2 ; calc s2=s1-s2 ; calc s1=s1-s2)

:交换方法2: 需要修复calc bug的新版WENV
WENV check ${s1}>=${s2} (calc s1=s1^s2 ; calc s2=s1^s2 ; calc s1=s1^s2)

:起始位置, 字节计数
WENV calc s1=s1+6+2
WENV calc s2=s2-s1-2

WENV call cat --skip=${s1} --length=${s2} /T.TXT


@chenall
不能用最新的测试版grldr运行,试了 11-03 的可以
11-05 的最新grldr在批处理中 WENV check  返回 0 时会终止执行批处理

[ 本帖最后由 tuxw 于 2010-11-6 01:34 编辑 ]

T.rar

440 Bytes, 下载次数: 422, 下载积分: 无忧币 -2

回复

使用道具 举报

10#
发表于 2010-11-6 11:40:40 | 只看该作者

GRUB4DOS更新建议专帖

和问题贴分开处理
回复

使用道具 举报

11#
 楼主| 发表于 2010-11-6 14:36:39 | 只看该作者
最近几天一直在分析N版的F6驱动(oem格式驱动),在现有的条件下,要想实现原SRS_F6返回模块的仿真盘功能实在太难了。而且很多oem驱动包也是这种格式的,下面贴出一部分,方便分析:

现有条件:只知道(1)
需要达到的目的:
  1:需要提取对应段落(2)段落名,提取出ICH10DAHCI
  2:需要提取对应段落(4),及所有sys扩展名的文件名、所有inf扩展名的文件名
  3:需要提取 “相对目录"

为何要这么做?
  1:需要(2)是为了修改默认SCSI
      也为了方便修改成单ID
  2:需要知道文件名及路径,主要是fat copy需要完整路径的文件名

[ 本帖最后由 zhaohj 于 2010-11-6 16:04 编辑 ]

F6.JPG (132.41 KB, 下载次数: 1014)

F6.JPG
回复

使用道具 举报

12#
发表于 2010-11-6 15:26:31 | 只看该作者
建议在无忧开个grub4dos的版块,时空论坛很少去。
回复

使用道具 举报

13#
 楼主| 发表于 2010-11-6 15:51:17 | 只看该作者
原帖由 tuxw 于 2010-11-5 22:26 发表
可以用 WENV 命令实现,只是步骤麻烦了点



你这个最大的问题:[bbbb]段落名不可能预先知道的。
回复

使用道具 举报

14#
发表于 2010-11-6 15:59:45 | 只看该作者
可以先查找 [aaaa] 再查找 [
如果 [bbbb] 不可预知,用 INIFILE 的方式更不可能实现,INI 是必须要知道段名和变量名才可以操作的
回复

使用道具 举报

15#
 楼主| 发表于 2010-11-6 20:14:55 | 只看该作者
我也测试是这样,批处理中无法使用wenv check
本来想用wenv for /f "delims= " %i in ("STRING”) do set s=%i 来获取16进制的第一个数值
发觉“ ”空格分隔符不起作用了。
----------
要用到新版的>>,看来得等到grldr修正了。
回复

使用道具 举报

16#
发表于 2010-11-6 21:13:05 | 只看该作者
现在不能用 WENV check " "<-"${VAR}" 来检查VAR是否包含空格(无空格时批处理会终止)

在grldr修正前可以用下面的临时办法代替
WENV reset tmp
WENV set tmp=${VAR# }  #无空格时tmp变量不存在
WENV get tmp && ...
回复

使用道具 举报

17#
 楼主| 发表于 2010-11-6 22:54:46 | 只看该作者
想把文本中注释先过滤掉,下面的命令竟然不行:
cat --length=0 (fd1)/txtsetup.oem && fat mkfile size=* (fd1)/temp
echo ; > (fd1)/temp
wenv for /f "eol=# delims=" %i in ( (fd1)/txtsetup.oem ) do (set a=%i ; echo $${a} >> (fd1)/temp)

不知哪里错了?帮忙测试一下

不过滤掉的话,比如[Disks],会找到多个,不知道哪个是需要的。

[ 本帖最后由 zhaohj 于 2010-11-6 23:06 编辑 ]

txtsetup.rar

1.55 KB, 下载次数: 93, 下载积分: 无忧币 -2

回复

使用道具 举报

18#
发表于 2010-11-6 23:09:17 | 只看该作者
原帖由 zhaohj 于 2010-11-6 20:14 发表
我也测试是这样,批处理中无法使用wenv check
本来想用wenv for /f "delims= " %i in ("STRING”) do set s=%i 来获取16进制的第一个数值
发觉“ ”空格分隔符不起作用了。
----------
要用到新版的>>,看来 ...


wenv默认就是使用空格作为分隔符的啊。这个怎么和GRLDR扯上关系了。应该是WENV的BUG。
回复

使用道具 举报

19#
 楼主| 发表于 2010-11-6 23:16:49 | 只看该作者
这个问题的发现,主要是locate=[ 时,象F6的txtsetup.oem有太多的[,导致变量值超过512。

我上传这个txtsetup.oem,比较大。

[ 本帖最后由 zhaohj 于 2010-11-6 23:18 编辑 ]

txtsetup.rar

2.42 KB, 下载次数: 92, 下载积分: 无忧币 -2

回复

使用道具 举报

20#
发表于 2010-11-6 23:18:13 | 只看该作者
原帖由 zhaohj 于 2010-11-6 22:54 发表
想把文本中注释先过滤掉,下面的命令竟然不行:
cat --length=0 (fd1)/txtsetup.oem && fat mkfile size=* (fd1)/temp
echo ; > (fd1)/temp
wenv for /f "eol=# delims=" %i in ( (fd1)/txtsetup.oem ) do ( ...


最后一条命令改成这样:
wenv for /f "eol=# delims=" %i in ( (fd1)/txtsetup.oem ) do echo %i  >> (fd1)/temp

DO 后面只能跟 WENV 子命令
而 >> 是 Grub4Dos 的特性,是 Grub4Dos 支持的命令间的分隔符

这个写法
wenv for /f "eol=# delims=" %i in ( (fd1)/txtsetup.oem ) do (set a=%i ; echo $${a} >> (fd1)/temp)
Grub4Dos在分析命令行时,会将 >> 前面的部分当作一条命令(显然这个格式是不合WENV语法的),然后将结果传给后面的部分

[ 本帖最后由 tuxw 于 2010-11-6 23:19 编辑 ]
回复

使用道具 举报

21#
发表于 2010-11-6 23:26:54 | 只看该作者
原帖由 zhaohj 于 2010-11-6 23:16 发表
这个问题的发现,主要是locate=[ 时,象F6的txtsetup.oem有太多的[,导致变量值超过512。

我上传这个txtsetup.oem,比较大。


这个也有办法解决,就是分块查找,不过批处理会比较复杂
或者将 locate=[ 的查找结果输出到临时文件,再对文件进行判断

[ 本帖最后由 tuxw 于 2010-11-6 23:28 编辑 ]
回复

使用道具 举报

22#
 楼主| 发表于 2010-11-6 23:31:39 | 只看该作者
#20楼还是有问题,你再测试一下,我的理解,应该do (...)
应该每个循环执行()中的命令
回复

使用道具 举报

23#
发表于 2010-11-6 23:38:28 | 只看该作者
原帖由 zhaohj 于 2010-11-6 20:14 发表
我也测试是这样,批处理中无法使用wenv check
本来想用wenv for /f "delims= " %i in ("STRING”) do set s=%i 来获取16进制的第一个数值
发觉“ ”空格分隔符不起作用了。
----------
要用到新版的>>,看来 ...



看了一下这个是WENV的BUG。
看下面的代码,等tuxw的修正版吧。

    for(i=0;i<7 && *arg;i++)
    {
     if (*arg == '\"' || *arg == ' ')
      break;
     delims = *arg++;
    }

简单一点处理只要再加一个判断就好了。
    if (*arg == '\"' || (*arg == ' ' && arg[1] != '\"'))

这样对语法要求比较严格,不能有多余的空格,当然正常情下这样处理就足够了,没有必要去作那么多的判断。
事实上许多GRUB4DOS的命令对语法要求都是比较严格的,可以节约一些代码空间。
回复

使用道具 举报

24#
发表于 2010-11-6 23:44:03 | 只看该作者
原帖由 zhaohj 于 2010-11-6 23:31 发表
#20楼还是有问题,你再测试一下,我的理解,应该do (...)
应该每个循环执行()中的命令


do 后面的 () 不是必须的,只是大多数时候后面不是一条简单的命令,所以要用集合命令,单命令时有无 () 没有关系

只要执行一个  WENV 命令看是否正常就行了
文件重定向不是在循环的时候一行行写入 temp 的,而是等前面的 WENV 命令执行完毕,然后将它的输出写入 temp
下面的输出已经过滤掉注释了



[ 本帖最后由 tuxw 于 2010-11-6 23:53 编辑 ]
回复

使用道具 举报

25#
发表于 2010-11-6 23:46:33 | 只看该作者
原帖由 chenall 于 2010-11-6 23:38 发表



看了一下这个是WENV的BUG。
看下面的代码,等tuxw的修正版吧。

    for(i=0;i

好,我重编译下

==================
已上传

[ 本帖最后由 tuxw 于 2010-11-6 23:58 编辑 ]
回复

使用道具 举报

26#
 楼主| 发表于 2010-11-7 00:12:23 | 只看该作者
新版grldr测试版,发觉cat命令的bug

Snap1.jpg (15.42 KB, 下载次数: 630)

Snap1.jpg
回复

使用道具 举报

27#
发表于 2010-11-7 00:21:22 | 只看该作者
额,,又没有完全清除前一句的error信息了。
回复

使用道具 举报

28#
发表于 2010-11-7 08:48:21 | 只看该作者
GETSECT.rar (820 Bytes, 下载次数: 104)

解决了大文件搜索结果超出512字节的问题



第3个参数指定缓冲区地址,不是必须的,不指定的话默认0x600000

[ 本帖最后由 tuxw 于 2010-11-7 09:12 编辑 ]
回复

使用道具 举报

29#
 楼主| 发表于 2010-11-7 10:38:10 | 只看该作者
呵呵,我也正在考虑这个问题呢!要么在cat中加参数--length=1024,控制搜索范围,要么放在文件中。
---------------
变量溢出的问题,我认为WENV应该自动截断比较好。

缓冲区地址,默认改成0x65000
WENV calc _ini_tmp=_ini_s1+${_ini_sc,?}+2

[ 本帖最后由 zhaohj 于 2010-11-7 10:52 编辑 ]
回复

使用道具 举报

30#
发表于 2010-11-7 10:52:11 | 只看该作者
自动截断不太好
可能你设置了一个超出长度的变量,但你没有注意到,自动截断后将这个问题掩盖了,而这个问题可能在很远的位置才表现出来,故障定位会比较麻烦

或者用一个变通的方式:设置一个开关,变量可能超长,但用户明确知道只需要截断的部分时,先打开这个开关

[ 本帖最后由 tuxw 于 2010-11-7 10:53 编辑 ]
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-11-22 04:15

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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