无忧启动论坛

 找回密码
 注册
搜索
WEPE笔记本电脑手机维修小包 IT发烧友的必备工具最纯净的「微PE装机优盘」UEPON大师作品卡瑞飞系统和装机二合一超级U盘
无忧启动论坛唯一网址:bbs.wuyou.net系统gho:最纯净好用系统下载站广告联系 QQ:184822951 微信:wuyouceo
查看: 273940|回复: 3015
打印 上一主题 下一主题

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

点评

www.13958867733.com/info/XrEFcWfFXrE/ 庶女嫡妃  发表于 2015-3-26 18:15
推荐
发表于 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, 下载次数: 132)

目前只能在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]段落的内容
回复

使用道具 举报

5#
发表于 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, 下载次数: 280, 下载积分: 无忧币 -2

回复

使用道具 举报

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

GRUB4DOS更新建议专帖

和问题贴分开处理
回复

使用道具 举报

7#
 楼主| 发表于 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, 下载次数: 391)

F6.JPG
回复

使用道具 举报

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

使用道具 举报

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



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

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2019-10-16 12:59

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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