zhaohj 发表于 2010-11-5 18:03:03

GRUB4DOS更新建议、bug反馈专帖

本帖主要为对grub4dos的建议,或是bug的反馈,问题请去问题专帖。          bysratlf

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

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 编辑 ]

tuxw 发表于 2010-11-6 19:14:06

原帖由 zhaohj 于 2010-11-6 16:14 发表 http://bbs.wuyou.net/images/common/back.gif


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

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



目前只能在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_*

zhaohj 发表于 2010-11-5 22:13:01

原帖由 chenall 于 2010-11-5 19:12 发表 http://bbs.wuyou.net/images/common/back.gif
我觉得这些不是很重要的东西尽量不要使用内部的命令去实现。

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

看看tuxw或zxw能不能 ...


sgrhgjhm
zbgnhgj

sytrhy
hnh
-------------------
我的目的很简单,如:INIFILE 文件名
显示段录内容

tuxw 发表于 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 编辑 ]

chenall 发表于 2010-11-5 19:12:01

我觉得这些不是很重要的东西尽量不要使用内部的命令去实现。

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

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

tuxw 发表于 2010-11-6 19:40:03

1105bug

11-05 版批处理BUG

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

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

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

tuxw 发表于 2010-11-6 19:22:03

我比较希望的用法是这样的
WENV read GetSect.env inifile

zhaohj 发表于 2010-11-6 16:14:26

原帖由 tuxw 于 2010-11-6 15:59 发表 http://bbs.wuyou.net/images/common/back.gif
可以先查找 再查找 [
如果不可预知,用 INIFILE 的方式更不可能实现,INI 是必须要知道段名和变量名才可以操作的

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

tuxw 发表于 2010-11-5 22:26:38

可以用 WENV 命令实现,只是步骤麻烦了点


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

:记录偏移2
cat --locate= /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 编辑 ]

sratlf 发表于 2010-11-6 11:40:40

GRUB4DOS更新建议专帖

和问题贴分开处理

zhaohj 发表于 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 编辑 ]

135956 发表于 2010-11-6 15:26:31

建议在无忧开个grub4dos的版块,时空论坛很少去。

zhaohj 发表于 2010-11-6 15:51:17

原帖由 tuxw 于 2010-11-5 22:26 发表 http://bbs.wuyou.net/images/common/back.gif
可以用 WENV 命令实现,只是步骤麻烦了点



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

tuxw 发表于 2010-11-6 15:59:45

可以先查找 再查找 [
如果 不可预知,用 INIFILE 的方式更不可能实现,INI 是必须要知道段名和变量名才可以操作的
页: [1] 2 3 4 5 6 7 8 9 10
查看完整版本: GRUB4DOS更新建议、bug反馈专帖